对于文件操作,python提供了3种做法:open(), os.open() 和with open()语句。
1. open()函数:一般用于更高级的文件读写操作,即人能读懂的用法,如果是写入数据,可用传入字符串。
用法:open(path, mode) 以给定的路径和模式去打开文件,返回一个文件对象。
mode参数有:
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
r | 只读 | error | - |
r+ | 读写 | error | T |
w | 只写 | create | T |
w+ | 读写 | create | T |
a | 只写 | createF,尾部追加写 | |
a+ | 读写 | create | F,尾部追加写 |
wb | 只写二进制字符串,写入bytes | creT | |
rb | 只读二进制字符串,返回bytes | error | - |
举例:
f = open('dt.txt', 'r')print(f.read())输出:
hello, world!ifu mark. hello test.
如果文件不存在,则会报IOError
读取文件时,注意字符集的设置。如果文件本身编码为gbk时,直接读取会报错
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 30: illegal multibyte sequence
这时需要将文件编码设置为encoding='utf-8', 这样再读取文件就不会报错了。
f = open('tes.txt', 'r', encoding='utf-8')
print(f.read())输出:
hello, world!ifu mark. hello test.
长江黄河都源远流长。
关闭文件:使用open()函数必须关闭文件,否则将会一直占有系统资源。但同时打开的文件数量有限,所以要及时把文件关闭。
f.close()
2. os.open(): 用于比较低级的方式去读取文件,是python的os模块提供的函数,以文件路径和模式为参数,返回文件描述符。
os.open(path, flags[,mode])
flags: 这个参数可以是以下选项,多个可用|隔开,常用的有
- os.O_RONLY: 以只读方式打开
- os.O_WRONLY: 以只写方式打开
- os.O_RDWR: 以读写方式打开
- os.O_APPEND: 以追加方式打开
- os.O_CREAT: 创建并打开一个新文件
举例:
f = os.open('dt.txt', os.O_RDWR|os.O_CREAT)
str = '长江永远是母亲河!'
s = bytes(str)
os.write(f, s)
os.close()
注意:如果直接写入字符串,会报错a bytes-like object is required, not 'str',需要提前把字符串转成bytes才能成功写入文件。
与open()一样,os.open()也需要关闭文件,释放系统资源。
3. with open()语句:这句话实际是对open() 和 close()函数的组合。它把文件的打开和关闭集中在了一起。
举例:
with open('dt.txt', 'r', encoding='utf-8') as f1, open('tes.txt', 'r', encoding='utf-8') as f2:print(f1.read())print(f2.read())输出:
hello, world!ifu mark. hello test.
hello, world!ifu mark. hello test.
长江黄河都源远流长。
同样:为了避免打开文件出现UnicodeDecodeError, 建议加上encoding='utf-8'这个参数。
4.异同点与最优选择:open()和os.open()函数不会自动关闭文件,而with open()语句会自动关闭文件,不会造成资源泄露的问题。
- open()和with open()函数是进行文件读取的常见操作,尤其是对于简单的文件读和写。
- 需要以低级别方式操作文件时,才使用os.open(),它更适用于特定的场景,如需要在文件中定位和读取特定位置的数据。
- 在使用with open()语句读取文件时,可以在语句块中进行其他的文件操作,如写入内容或定位文件指针位置。
综上,with open()是文件操作的最佳选择,建议在需要进行文件操作时多多使用。