python读写文件需要先使用open函数获得文件对象,open函数中有一个 mode参数,默认为 r ,在不同的应用场景下,要选择不同的模式,下表是mode参数的可选值列表
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 |
模式虽然很多,但常用的只有前5种,学会这5种,其余的,也就融会贯通了。
这两个模式都是写文件时用的模式,不同之处在于,w是以文本文件格式打开文件进行写, wb模式是以二进制格式打开文件进行写操作,那么他们之间的区别是什么呢,下面用一段代码来说明
text = '学习python'
f = open('data', 'w')
f.write(text)
f.close()
f = open('data_byte', 'wb')
b_text = text.encode(encoding='utf-8')
f.write(b_text)
f.close()
区别只有一处,如果是以wb模式打开,使用write方法时,只能传入bytes类型的数据,因此需要使用encode方法先将str转成bytes类型数据。
打开写好的两个文件,其实,他们在内容上是没有区别的
既然他们没有区别,有何必弄出两个来呢? 原来有些数据,本身就是二进制的,而且不能也务必要转成字符串类型,那么这种数据写入文件就需要以wb的模式打开文件,下面就是一个具体的例子
import pickle
class Stu:
def __init__(self, name, age):
self.name = name
self.age = age
stu = Stu('小明', 15)
f = open('stu_obj', 'wb')
pickle.dump(stu, f)
f.close()
上面的代码里,将stu对象序列化到文件中,这种场景下,就需要以wb模式打开文件。
r与w相对应,rb与wb模式相对应,想要将上面的例子中写入到文件中的stu对象读取出来,就需要使用下面的代码
f = open('stu_obj', 'rb')
stu = pickle.load(f)
f.close()
print(stu)
如果你用r模式打开并读取数据,程序不会报错,但是你无法还原stu对象,如果感兴趣,你可以自己运行上面的代码,打开stu_obj文件,你看到的是下面的内容
我这里之所以用图片,是因为如果将这段文字复制到我的编辑器中,有一部分无法显示。
使用w模式时,如果文件已经存在,那么再次打开后,文件里原有的内容就会消失,因为打开后,文件指针指向了文件开始的地方,写数据就会从这里写。
如果你希望文件二次打开写入数据时,数据能从文件的末尾开始写,这样原有的内容可以保留下来,那么你需要用a的模式打开
QQ交流群: 211426309