基石为勤能补拙的迷宫之旅——第八天(Python文件操作)

一、文件操作基本步骤

1.打开文件的两种方式

变量名 = open('需打开的文件','模式选择',encoding='编码类型')

with open('需打开的文件','模式选择',encoding='编码类型') as 变量名:

    将文件的关闭交给with管理,当with中逻辑结束后,系统会自动释放文件,不必进行close()。

2.操作文件(模式汇总)

主模式:

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

从模式:

  • t: 文本操作(默认模式) r=>rt w=>wt a=>at
  • b: 非文本文件必须采用二进制模式来处理
  • +: 可读可写

组合:

  • r+: 不会创建文件的可读可写
  • w+:创建并清空文件的可读可写
  • a+:创建不清空文件(追加)的可读可写
  • rb: 二进制读
  • wb:创建清空文件的二进制写
  • ab: 创建不清空文件(追加)的二进制写
  • rb+ :不会创建文件的二进制可读可写
  • wb+:创建并清空文件的二进制可读可写
  • ab+:创建不清空文件(追加)的二进制可读可写

打入冷宫

  • x:写模式,创建文件,如果文件已存在,就报错
  • U:弃用

3.关闭文件

    f.close()

二、文件操作模式进阶

1.追加写入

newline 读取一个字节,如果是行/文件等结束标识,返回该标识,否则返回None

(1)借助读写,完成追加

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)

(2)a为写模式,在原数据后追加写入新数据

with open('1.txt', 'a', encoding='utf-8') as f:
    f.write('777')

2.文件复制

(1)文本类型文件的复制

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()

2.先读后写复制(用with方法)

with open('1.txt','r',encoding='utf-8') as r,open('11.txt','w',encoding='utf-8') as w:
for line in r: 
	w.write(line)
	w.flush

3.边读边写复制

with open('sourse.txt','r',encoding='utf-8') as f1:
	with open('target.txt','w+',encoding='utf-8') as f2:
        for line in f1:
            f2.write(line)

(2)非文本文件复制

从模式采用b模式,不需要关心编码问题。

 #  图片复制
 with open('001.png','rb') as f1:
	with open('100.png','wb+') as f2:
        for line in f1:
            f2.write(line) #  同理视频复制如此,只是文件后缀名不同。

游标操作

1.如何使用游标:游标的相关方法

方法:seek(偏移量, 偏移位置)
偏移量:移动的字节数,负数是结合模式1,2往前偏移
偏移位置:

  • 0 - 从文件开始位置开始偏移
  • 1 - 从当前游标位置开始偏移
  • 2 - 从文件末尾开始偏移

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

3.游标写:会覆盖书写

with open('source.txt', 'rb+') as f:
    f.seek(11)
    # print(f.read())
    f.write(b'000')

案例:百度云盘秒传模拟

百度——秒传 真实数据在服务器,10000个人拥有同一个文件,百度只需存一个
在大文件中,开头,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)

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('慢慢传去吧')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值