读取文件
全部读取
新建一个a.txt文件,里面写入如下三行:
aaa
bbb
ccc
python自动导入了io模块,我们可以直接使用open函数来打开文件,得到文件对象,然后调用对象的read方法获取文件内容。
file = open("a.txt") data = file.read() file.close() print(data)
打印结果:
aaa
bbb
ccc
通常,在程序退出时会自动关闭文件对象,但是有可能我们的程序运行时间长呢,也就占用了文件锁,并且写入文件的时候,文件内容会被放入缓冲区以提高效率,此时如果程序未运行完就报错了,那么写入的内容实际上是不会写入文件的。所以关闭文件没有坏处,应该要养成用完就关的习惯。
为了保证文件一定能关闭,程序员一般的做法是使用异常捕获的方式处理。而python给我们提供了便利的写法 :with上下文管理器
with open("a.txt") as file: data = file.read() print(data)
注意一点,如果文件之中有中文,可能会出现文件是utf-8格式的情况,这种情况下read方法读取中文内容就会报错,需要打开文件的时候指定编码:
with open("a.txt",encoding='utf-8') as file: data = file.read() print(data)
逐行读取
逐行读取有三种写法,第一种是文件迭代器,直接遍历打开的文件对象
with open("a.txt") as file: for line in file: print(line.rstrip())
打印结果:
aaa
bbb
ccc
进行rstrip过滤是因为每一行的末尾都隐藏的有回车换行。
第二种是使用readline方法每次读取一行
with open("a.txt") as file: while True: data = file.readline() if not data: break print(data.rstrip())
打印结果:
aaa
bbb
ccc
第三种用readlines方法将文件所有内容取出装入一个列表中,然后遍历列表
with open("a.txt") as file: lines = file.readlines() for data in lines: print(data.rstrip())
打印结果:
aaa
bbb
ccc
写入文件
写入文件要在打开文件的时候提供第二个参数表明已什么方式打开,读取文件内容的时候是没有传入参数的,实际上是默认为读模式。
with open("b.txt",'w') as file: file.write('aaa')
参数常用有如下几种:
r:读模式
w:写模式
x:独占写模式
a:追加写模式 以这种模式打开文件后 指针会放到文件的末尾
b:二进制模式
+:读写模式 必须和其他模式搭配使用 如r+(指针在开头,先读后写)、a+(指针在末尾,可读追加写)、w+(指针在开头,覆盖写读)
需要介绍的是r+和w+的区别,都是读写,但不一样的是指针的位置
r+模式指针在文档开头,读一行指针走一行,如果读完之后再写入,指针就到了文件末尾,那么写入的内容就是追加的,如果先写入,那么就是覆盖的。
比如现在b.txt里面有4个字符:
abcd
那么我先写后读:
with open("b.txt",'r+') as file: file.write('x') file.write('y') file.seek(0) print(file.read())
打印结果:
xycd
可以看到,写入了两个字符,就是覆盖了前两个字符,后面的字符仍然没变。seek(0)是操作指针回到开头,要不然只会打印出后面的cd两个字符。
w+是全截断覆盖写,也就是把文档当做一个空白文档新写东西,无论文档里面有啥,读出来的都是空。
把b.txt的内容恢复成abcd四个字符。
with open("b.txt",'w+') as file: print(file.read()) file.write('x') file.write('y') file.seek(0) print(file.read())
打印结果:
xy