python文件rw_python文件操作详解

本文详细介绍了Python中文件的rw模式,包括w、w+、a、a+、r+等模式的使用,以及如何进行文件复制、二进制文件处理、游标操作。重点讲解了利用with open管理文件的打开和关闭,并展示了如何实现大文件的秒传规则生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rw模式结合

'''

# w:没有文件新建文件,有文件就清空文件

w = open('1.txt', 'w', encoding='utf-8')

w.write('000\n')

# 在写入大量数据,要及时处理内存空间,不然内存可能溢出导致数据丢失

w.flush()

w.write('111\n')

# 最后一次flush()操作可以省略

w.flush()

# 一次性写入多行

w.writelines(['222\n', '333\n'])

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 open:将文件的释放交给with管理

with open('文件', '模式', encoding='utf-8') as f:

# 操作

pass

a模式:追加写入

# temp.txt

# 111222333

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

f.write('new msg')

# 结果:111222333new msg

文件的复制:就是先读再写

# 文本类型文件的复制

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语法如何处理?

# r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写

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)

# 如果复制非文本类型的数据文件?

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

with open('source.mp4', 'rb') as f1:

with open('target.mp4', 'wb+') as f2: # rb+ | wb | wb+ | ab | ab+

for line in f1:

f2.write(line)

模式汇总

*****

'''

r: 读

w: 写(无创建,有清空)

a: 追加(有创建的功能)

t: 文本操作(默认模式) r=>rt w=>wt a=>at

b: 非文本文件必须采用二进制模式来处理

+: 可读可写

r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写

rb: 二进制读 | wb:创建清空文件的二进制写 | ab: 创建不清空文件(追加)的二进制写

rb+ | wb+ | ab+

'''

游标:必须在b模式下操作,seek中偏移的是字节

'''

百度网盘 - 秒传

'''

'''

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

2. 游标相关的读写操作

3. 根据游标在大文件中取出多个指定位置的部分字节内容

'''

'''

seek(偏移量, 偏移位置)

偏移位置:

0 -- 文件开头

1 -- 当前位置

2 -- 文件末尾

'''

# 游标读

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

# 游标写:会覆盖书写

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)

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('慢慢传去吧')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值