5种python常用读写文件方法精讲

python读写文件需要先使用open函数获得文件对象,open函数中有一个 mode参数,默认为 r ,在不同的应用场景下,要选择不同的模式,下表是mode参数的可选值列表

访问模式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写

模式虽然很多,但常用的只有前5种,学会这5种,其余的,也就融会贯通了。

1. w 和 wb模式

这两个模式都是写文件时用的模式,不同之处在于,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模式打开文件。

2. r 和 rb模式

r与w相对应,rb与wb模式相对应,想要将上面的例子中写入到文件中的stu对象读取出来,就需要使用下面的代码

f = open('stu_obj', 'rb')
stu = pickle.load(f)
f.close()

print(stu)

如果你用r模式打开并读取数据,程序不会报错,但是你无法还原stu对象,如果感兴趣,你可以自己运行上面的代码,打开stu_obj文件,你看到的是下面的内容

我这里之所以用图片,是因为如果将这段文字复制到我的编辑器中,有一部分无法显示。

3. a 模式,追加模式

使用w模式时,如果文件已经存在,那么再次打开后,文件里原有的内容就会消失,因为打开后,文件指针指向了文件开始的地方,写数据就会从这里写。

如果你希望文件二次打开写入数据时,数据能从文件的末尾开始写,这样原有的内容可以保留下来,那么你需要用a的模式打开

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案