读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
读文件
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符要注意的是:文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,例子如下:
使用open语句读取文件内全部字符:
#读取txt文件
f=open('1.txt','r')#r表示以只读方式打开文件
print(f.read())#read方法读取所有字符
f.close()
#输出如下:
python
java
c
c++
由于文件路径以及其他原因,open语句经常会报错IOError
,报错之后f.close()
就不会再被执行了,这是我们不想看到的,所以可以使用try
语句改进上面的代码,如下:
try:
f=open('1.txt','r')
print(f.read())
except:
if f:
f.close()
###输出如下:
python
java
c
c++
但这样又显得代码量较大,这与python之禅是相违背的,因此with
语句就诞生了,该语句会在执行时自动帮我们调用close
方法,改进后的代码如下:
with open('1.txt','r') as f:
print(f.read())
###输出如下:
python
java
c
c++
两行代码既稳定又简洁的读取了文件内容。
调用read()
会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)
方法,每次最多读取size
个字节的内容。另外,调用readline()
可以每次读取一行内容,调用readlines()
一次读取所有内容并按行返回list。因此,可以根据需要决定怎么调用。例如还是读取刚才的文件:
with open('1.txt','r') as f:
print(f.readlines())
#输出如下:
['python\n', 'java\n', 'c\n', 'c++']
写入文件
写入文件之前也需要先用open
方法打开文件,例子如下:
with open('1.txt', 'r+') as f:#r+表示可读可写模式
print(f.read())
f.write('\ngo')
print("写入后的文件:")
with open('1.txt', 'r') as f:
print(f.read())
#输出如下:
python
java
c
c++
写入后的文件:
python
java
c
c++
go
可以看出,r+
模式下写入字符,是直接在文本末尾添加字符的,而另外一种写入模式w
与此不同:
with open('1.txt', 'r') as f:#r+表示可读可写模式
print(f.read())
with open('1.txt','w') as f:
f.write('go')
print("写入后的文件:")
with open('1.txt', 'r') as f:
print(f.read())
#输出如下:
python
java
c
c++
写入后的文件:
go
可以看出,w
模式下写入会直接覆盖掉原有字符,相当于把原文件内容清空在写入新字符
编码
读取文件和写入文件默认的编码都是UTF-8
,如果被读文件不是以该方式编码的,那么读取出来的内容就会出现乱码的情况,这个时候只需要向open
函数里传入一个encoding
参数即可
with open('1.txt', 'r',encoding='gbk') as f:#r+表示可读可写模式
print(f.read())
遇到有些编码不规范的文件,直接读取可能会报错,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()
函数还可以接收一个errors
参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
with open('1.txt', 'r',encoding='gbk',errors='ignore') as f:#r+表示可读可写模式
print(f.read())
最后附上所有文件读写模式表
模式 | 描述 |
---|---|
r | 只读模式 |
w | 只写模式,创建新文件(清除路径下同名文件中的数据) |
x | 只写模式,创建新文件,但存在同名路径时会创建失败 |
a | 添加到已经存在的文件里,如果不存在就创建 |
r+ | 读写模式 |
b | 二进制文件的模式,可以添加到别的模式中,如”rb“或”wb“ |
t | 文件的文本模式(自动将字节解码为Unicode)。如果没有指明模式,默认使用此模式,也可以添加到其它模式中(”rt“、”xt“) |