python 文件处理
模式种类
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
rb 以二进制读取
w 打开只写文件,若文件存则全部清空,若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存则全部清空,若文件不存在则建立该文件。
wb 以二进制写入
a 附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,后面添加
a+ 附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,后面添加,读取的时候也是从后面开始读
ab 以二进制附加
demo.txt
昨夜雨疏风骤,浓睡不消残酒。
试问卷帘人,却道海棠依旧。
知否,知否,应是绿肥红瘦。
用法
readline() 读取一行
with open("demo.txt","r",encoding="utf-8") as f: print(f.readline()) print(f.readline())
结果:
昨夜雨疏风骤,浓睡不消残酒。
试问卷帘人,却道海棠依旧。
他会根据当前的光标继续向下
readlines() 读取多行
with open("demo.txt","r",encoding="utf-8") as f: print(f.readlines())
结果:
['昨夜雨疏风骤,浓睡不消残酒。\n', '试问卷帘人,却道海棠依旧。\n', '知否,知否,应是绿肥红瘦。']
以列表形式返回
但这样存储,会占相应的内存
tell() 获取当前光标位置
with open("demo.txt","r+",encoding="utf-8") as f: print(f.tell()) # 0 read = f.read(1) print(f.tell()) # 3
一个中文占3个字节,所以读取一个字符,光标是 3
seek() 调整光标位置
with open("demo.txt","r+",encoding="utf-8") as f: r = f.readline() print(r.strip()) # 昨夜雨疏风骤,浓睡不消残酒。 print(f.tell()) # 44 f.seek(0) r = f.readline() print(r.strip()) # 昨夜雨疏风骤,浓睡不消残酒。
flush() 更新
将缓存里的数据转到磁盘
进度条:
因为终端也是一个文件,也可以调用 flush()
import sys import time for i in range(20): # 操作终端 sys.stdout.write("*") # 将缓存的数据更新到终端 sys.stdout.flush() time.sleep(0.1)
truncate() 截断
参数(保留的字节数),不写参数会截断所有
with open("demo.txt","a",encoding="utf-8") as f: f.truncate(12) # 昨夜雨疏
截断12个字节,却只有4个字符,因为一个中文占3个字节
其他操作
# 是否是终端 print(f.isatty()) # 是否可读 print(f.readable()) # 是否可写 print(f.writable())
内存处理
with open("demo.txt","r+",encoding="utf-8") as f: # 这是for内部将f对象做成一个迭代器,用的时候一行一行的取 for i in f: print(i.strip())
更新文件
最好的方法就是,再写一份
with open("demo.txt","r",encoding="utf-8") as f,open("demo备份.txt","w",encoding="utf-8") as n: n.write("李清照\n") num = 0 for i in f: num += 1 if num == 2: i = "".join([i.strip(),("这是插入的内容\n")]) n.write(i)
李清照
昨夜雨疏风骤,浓睡不消残酒。
试问卷帘人,却道海棠依旧。这是插入的内容
知否,知否,应是绿肥红瘦。