python学习笔记——文件读写


读写文件是最常见的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“)

文章作者: Reset Ran
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Reset Ran !
评论
  目录