文件操作的模式选择

一、rw模式的结合

# w:没有文件新建文件,有文件就清空文件
  w = open('1.txt', 'w', encoding='utf-8')
  w.write('000 ')
# 在写入大量数据,要及时处理内存空间,不然内存可能溢出导致数据丢失
  w.flush()
  w.write('111 ')
# 最后一次flush()操作可以省略
  w.flush()
# 一次性写入多行
  w.writelines(['222 ', '333 '])
  w.write('444')
# w.newlines
  w.write('555')
# 1.将内存的的数据刷新到硬盘中;2.释放文件资源
  w.close()

# 需求:
# 1.完成文本类型的文件复制:1.txt => 11.txt
  r = open('1.txt', 'r', encoding='utf-8')
  w = open('11.txt', 'w', encoding='utf-8')
  for line in r: # 遍历就是一行一行读 取读文件的流
  w.write(line)
  w.flush()
  w.close()
  r.close()

# 将文件的关闭交给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', 'wt', encoding='utf-8') as f:
  # f.write('666')

  # 借助读写,完成追加
  # 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)

# a为写模式,在原数据后追加写入新数据
  with open('1.txt', 'a', encoding='utf-8') as f:
  f.write('777')

!!!边读边写复制

  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)

# x:写模式,创建文件,如果文件以存在,就抛异常
  with open('000.txt', 'x', encoding='utf-8') as f:
  pass

***文件的游标操作***

# 方法: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')

# 案例:百度网盘的秒传。

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)

newData = b""
with open('001.png', 'rb') as f:
data = f.read()
length = len(data)
f.seek(0, 0)
newData += f.read(10)
f.seek(length // 3, 0)
newData += f.read(10)
f.seek(length // 3 * 2, 0)
newData += f.read(10)
f.seek(-10, 2)
newData += f.read(10)

if newData == tagData:
print('秒传成功')
else:
print('传的这么慢,你个**')

原文地址:https://www.cnblogs.com/wanglei957/p/10609665.html