day--07

文件with管理

# 将文件的关闭交给with管理,当with中逻辑结束后,系统会自动释放文件
with open('1.txt', 'r', encoding='utf-8') as r, open('source.txt', 'w', encoding='utf-8') as w:
   for line in r:
       w.write(line)
       w.flush()
   # w.close() 系统自动完成
   # r.close()

文件的操作模式

r: 
w: 写(无创建,有清空)
a: 追加(有创建的功能)

t: 文本操作(默认模式)  r=>rt w=>wt a=>at
b: 非文本文件必须采用二进制模式来处理
+: 可读可写
r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写

x:
U:

# 借助读写,完成追加
# with open('1.txt', 'rt', encoding='utf-8') as f1:
#     data = f1.read()
#     data += '666'
# with open('1.txt', 'wt', encoding='utf-8') as f2:
#     f2.write(data)

with完成文件复制

# 借助读写,完成追加
# with open('1.txt', 'rt', encoding='utf-8') as f1:
#     data = f1.read()
#     data += '666'
# with open('1.txt', 'wt', encoding='utf-8') as f2:
#     f2.write(data)

# 先读后写
r = open('source.txt', 'r', encoding='utf-8')
w = open('target.txt', 'w', encoding='utf-8')
for line in r:  # 遍历就是一行一行读 取读文件的流
   w.write(line)
   w.flush()  # 将写入到内存中的数据刷新到硬盘中
w.close()
r.close()
# 边读边写赋值
with open('source.txt', 'r', encoding='utf-8') as f1:
   with open('target.txt', 'a+', encoding='utf-8') as f2:
       for line in f1:
           f2.write(line)

 

游标操作

`

# 方法:seek(偏移量, 偏移位置)
# 偏移量:移动的字节数,负数是结合模式1,2往前偏移
# 偏移位置:
#   -- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移
# b'你好1234567890'
# 游标读
with open('source.txt', 'rb') as f:
   d1 = f.read(11)
   print(d1)
   # print(d1.decode('utf-8'))

   # 当前游标的位置
   print(f.tell())

   # 游标操作 - 从末尾位置开始
   f.seek(-3, 2)
   d2 = f.read()
   print(d2.decode('utf-8'))  # 890

   # # 游标操作 - 从当前位置开始
   # f.seek(-3, 1)
   # d2 = f.read()
   # print(d2.decode('utf-8')) # 34567890

   # # 游标操作 - 从头开始
   # f.seek(3, 0)
   # d2 = f.read()
   # # print(d2)
   # print(d2.decode('utf-8')) # 好1234567890

# 游标写:会覆盖书写
with open('source.txt', 'rb+') as f:
   f.seek(11)
   # print(f.read())
   f.write(b'000')
   # 案例
with open('001.png', 'rb') as f:
   data = f.read()
print(len(data))

# 在大文件中,开头| 1/3 | 2/3 | 末尾 各取10个字节拼接成秒传的信息依据
# 形成秒传规则
tagData = b''
with open('001.png', 'rb') as f:
   # 通过其他途径(sys模块)来获取文件总大小
   data = f.read()
   length = len(data)
   # 开头
   f.seek(0, 0)
   d1 = f.read(10)
   # 1/3
   f.seek(length // 3, 0)
   d2 = f.read(10)
   # 2/3
   f.seek(length // 3 * 2, 0)
   d3 = f.read(10)
   # 末尾
   f.seek(-10, 2)
   d4 = f.read(10)
   tagData = d1 + d2 + d3 + d4
# 秒传依据
print(tagData)

 

原文地址:https://www.cnblogs.com/king-home/p/10611240.html