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个字节后的东西全清空
原文地址:https://www.cnblogs.com/XuChengNotes/p/11321790.html