读写文件
基本语法
与c的读写兼容
f=open('文件地址','r')
读取文件内容
如果要写入只需要把r
改成w
(文本文件)或者wb
(二进制文件)。
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
f.read()
会一次性输出文件内容,用一个str
对象表示
最后f.close()
关闭文件
但是如果文件读写失败,执行f.close()
失败(因为文件已经打开i,所以必须关闭文件),用try ...finally
避免
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
with…as
引用with
帮助我们正确关闭文件,而不需要使用try ...finally
with open('/path/to/file', 'r') as f:
print(f.read())
read(size) readline() readlines()
read(size)
不会一次性读取全部内容,只读取size个字节,可以重复调用。
readline()
每次读取一行,类似于c++中getline()
readlines
一次性读取所有内容,但按行返回一个list
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
file-like Object
像open()
函数返回的这种有个read()方法的对象,在Python中统称为file-like Object
。除了file
外,还可以是内存的字节流,网络流,自定义流等等。file-like Object
不要求从特定类继承,只要写个read()
方法就行。
StringIO
就是在内存中创建的file-like Object
,常用作临时缓冲。
把数据当作流会非常方便
字符编码
读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,例如gbk编码文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError
,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()
函数还接收一个errors
参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')