文件读写是我们经常需要用到的功能,本节介绍文件读写,包括读文件、写文件、关闭文件、with 方法,还介绍了 csv 文件的读写。

素材准备

新建一个txt文件,例如test.txt,写入以下内容:

this is a test file.
hello world!
python is good!
today is a good day.

文件读写

读文件

使用 open 函数来读文件,使用文件名的字符串作为输入参数:

f = open('test.txt')  # 此时txt文件和py文件在一个路径下的话可以这么写

默认以读的方式打开文件,如果文件不存在会报错:

f1 = open('test1.txt')

可以使用 read 方法来读入文件中的所有内容:

text = f.read()
print(text)

# 运行结果:
# this is a test file.
# hello world!
# python is good!
# today is a good day.

也可以按照行读入内容,readlines 方法返回一个列表,每个元素代表文件中每一行的内容:

f = open('test.txt')
lines = f.readlines()
print(lines)

# 运行结果:
# ['this is a test file.\n', 'hello world!\n', 'python is good!\n', 'today is a good day.\n']

使用完文件之后,需要将文件关闭。

f.close()

事实上,我们可以将 f 放在一个循环中,得到它每一行的内容:

f = open('test.txt')
for line in f:
    print(line)
f.close()

#运行结果:
# this is a test file.

# hello world!

# python is good!

# today is a good day.

删除刚才创建的文件:

import os
os.remove('test.txt')

写文件

我们使用 open 函数的写入模式来写文件:

f = open('myfile.txt', 'w')
f.write('hello world!')
f.close()

使用 w 模式时,如果文件不存在会被创建,我们可以查看是否真的写入成功:

print(open('myfile.txt').read())

#运行结果: hello world!

如果文件已经存在, w 模式会覆盖之前写的所有内容:

f = open('myfile.txt', 'w')
f.write('another hello world!')
f.close()
print(open('myfile.txt').read())

# 运行结果: another hello world!

除了写入模式,还有追加模式 a ,追加模式不会覆盖之前已经写入的内容,而是在之后继续写入:

f = open('myfile.txt', 'a')
f.write('... and more')
f.close()
print(open('myfile.txt').read())

#运行结果: another hello world!... and more

写入结束之后一定要将文件关闭,否则可能出现内容没有完全写入文件中的情况。

还可以使用读写模式 w+,这里 f.seek(6) 移动到文件的第6个字符处,然后 f.read() 读出剩下的内容:

f = open('myfile.txt', 'w+')
f.write('hello world!')
f.seek(6)
print(f.read())
f.close()

#运行结果: world!

删除刚才创建的文件:

import os
os.remove('myfile.txt')

关闭文件

Python 中,如果一个打开的文件不再被其他变量引用时,它会自动关闭这个文件。

所以正常情况下,如果一个文件正常被关闭了,忘记调用文件的 close 方法不会有什么问题。

关闭文件可以保证内容已经被写入文件,而不关闭可能会出现意想不到的结果

f = open('newfile.txt','w')
f.write('hello world')
g = open('newfile.txt', 'r')
print(repr(g.read()))

#运行结果:  ''

虽然这里写了内容,但是在关闭之前,这个内容并没有被写入磁盘

使用循环写入的内容也并不完整:

import os
os.remove('newfile.txt')

f = open('newfile.txt','w')
for i in range(30):
    f.write('hello world: ' + str(i) + '\n')


g = open('newfile.txt', 'r')
print(repr(g.read()))
f.close()
g.close()

#运行结果: ''

我们可以使用 try/except/finally 块来关闭文件,这里 finally 确保关闭文件,所有的写入已经完成。

f = open('newfile.txt','w')
try:
    for i in range(30):
        x = 1.0 / (i - 10)
        f.write('hello world: ' + str(i) + '\n')
except Exception:
    print("something bad happened")
finally:
    f.close()

#运行结果: something bad happened
g = open('newfile.txt', 'r')
print(g.read())
g.close()

# 运行结果:
# hello world: 0
# hello world: 1
# hello world: 2
# hello world: 3
# hello world: 4
# hello world: 5
# hello world: 6
# hello world: 7
# hello world: 8
# hello world: 9

关闭文件的with 方法

事实上,Python 提供了更安全的方法,当 with 块的内容结束后,Python 会自动调用它的close 方法,确保读写的安全:

import os
os.remove('newfile.txt')
with open('newfile.txt','w') as f:
    for i in range(10):
        f.write('hello world: ' + str(i) + '\n')
g = open('newfile.txt', 'r')
print(g.read())
g.close()

# 运行结果:
# hello world: 0
# hello world: 1
# hello world: 2
# hello world: 3
# hello world: 4
# hello world: 5
# hello world: 6
# hello world: 7
# hello world: 8
# hello world: 9

try/exception/finally 效果相同,但更简单。

所以,写文件时候要确保文件被正确关闭。

CSV 文件和 csv 模块

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

标准库中有自带的 csv 模块处理 csv 格式的文件:

import csv

读 csv 文件

假设我们有这样的一个文件data.csv

%%file data.csv
"alpha 1",  100, -1.443
"beat  3",   12, -0.0934
"gamma 3a", 192, -0.6621
"delta 2a",  15, -4.515

打开这个文件,并产生一个文件 reader:

# 打开 data.csv 文件
fp = open("data.csv")

# 读取文件
r = csv.reader(fp)

# 可以按行迭代数据
for row in r:
    print(row)

# 关闭文件
fp.close()

# 运行结果:
# ['alpha 1', '  100', ' -1.443']
# ['beat  3', '   12', ' -0.0934']
# ['gamma 3a', ' 192', ' -0.6621']
# ['delta 2a', '  15', ' -4.515']

默认数据内容都被当作字符串处理,不过可以自己进行处理:

data = []

with open('data.csv') as fp:
    r = csv.reader(fp)
    for row in r:
        data.append([row[0], int(row[1]), float(row[2])])

data

# 运行结果:
# [['alpha 1', 100, -1.443],
# ['beat  3', 12, -0.0934],
# ['gamma 3a', 192, -0.6621],
# ['delta 2a', 15, -4.515]]

写 csv 文件

可以使用 csv.writer 写入文件,不过相应地,传入的应该是以写方式打开的文件,不过一般要用 'wb' 即二进制写入方式,防止出现换行不正确的问题:

data = [('one', 1, 1.5), ('two', 2, 8.0)]
with open('out.csv', 'w') as fp:
    w = csv.writer(fp)
    w.writerows(data)

显示结果:

data = []

with open('out.csv') as fp:
    r = csv.reader(fp)
    for row in r:
        data.append((row[0], int(row[1]), float(row[2])))

data

#运行结果: [('one', 1, 1.5), ('two', 2, 8.0)]

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/RePython13.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 13 日
如果觉得我的文章对你有用,请随意赞赏