040 文件的高级应用
目录
一、可读可写
- r+t: 可读、可写
- w+t: 可写、可读
- a+t: 可追加、可读
# r+t模式 可读可写(尽量不要使用)
with open('test.txt', 'r+', encoding='utf8') as fr: # r+ 在后面追加
print(fr.readable()) # 是否可读 True
data = fr.read()
print(data)
print(fr.writable()) # 是否可写 True
fr.write('x = 10') # 在后面追加内容
print(fr.readable()) # 是否可读 True
data = fr.read() # 文件指针已经到了末尾,在读已经读不到数据
print(data)
# w+t模式 可写可读,但是当打开文件时,w的功能就会清空文件(更不要使用)
with open('test.txt', 'w+', encoding='utf-8') as fw: # 一打开就文件就被清空了
print(fw.readable()) # True
data = fw.read()
print(data) # 没有数据
print(fw.writable()) # True
fw.write('x = 10') # 写数据
data = fw.read() # 文件指针已经到末尾,读不到数据
print(data)
# a+t模式 有追加的功能,a的指针在末尾,a+功能也没用
with open('test.txt', 'a+', encoding='utf8') as fr:
# fr.seek(1, 0)
print(fr.readable()) # True
data = fr.read() # 指针在末尾,读不到数据
print(data)
print(fr.writable()) # True
fr.write('x = 10') # 写入数据
fr.flush() # 刷到内存中
data = fr.read() # 指针在末尾,读不到数据
print(data)
二、文件内指针移动
假设我们需要在文件内容中间的某一行增加内容,如果使用基础的r/w/a模式实现是非常困难的,因此我们需要对文件内的指针进行移动。
2.1 seek(offset,whence): offset表示文件指针的偏移量,单位是字节
# 文件指针的应用,移动指针
# seek(按字节位移) # 英文一个字节,中文两个字节
with open('test.txt', 'rb') as fr: # 需要使用rb模式
fr.seek(1) # 1表示位移1位,默认从文件头开始
fr.seek(1, 0) # 1表示偏移1位,0表示从头开始
fr.seek(2, 1) # 2表示偏移2位,1表示从当前位置开始
fr.seek(-2, 2) # -2表示向前偏移2位,2表示文件末开始
print(fr.read())
2.2 tell(): 统计从文件开头到当前文件指针的字节数
with open('test.txt', 'r',encoding="utf8") as fr:
fr.seek(0, 2) # 移动到文件末尾
print(fr.tell()) # 这样就能统计文件字节长度
2.3 read(n): 读n个长度的字符,如果是字节就读取的是字节
with open('test.txt', 'r',encoding="utf8") as fr: # r模式
print(fr.read(2)) # 读了2个字符
with open('test.txt', 'rb') as fr: # rb模式
print(fr.read(2)) # 读了2个字节
2.4 truncate(n):从n个字节处截取文件
with open('test.txt', 'a',encoding="utf8") as fr: # 使用追加模式
fr.truncate(7) # 截取文件,把7个字节后的东西全清空