3.27学习心得(rw模式结合,文件操作模式,with完成文本操作,非文本文件复制,游标操作)

一.rw模式结合

w:没有文件新建文件,有文件就清空文件。
w = open(‘1.txt’,‘w’,encoding=‘utf-8’)
w.write(‘000\n’)
在写入大量数据,要及时处理内存内存空间,不然内存可能溢出,导致数据丢失。
w.flush()
w.write(‘111\n’)
最后一次flush()操作可以省略。
一次性写入多行

w.writelines(['222\n','333\n'])
w.write('444')
w.newlines
w.write('555')
#将内存的数据刷新到硬盘,并释放文件资源
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()	


2.将文件的关闭交给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+:创建不清空文件(追加)的可读可写

# 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 完成文本复制

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)

非文本文件的复制

# with open('333.mp4', 'rb') as f1:
#     with open('666.mp4', 'wb+') 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 - 从文件末尾开始偏移

例子:

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个字节拼接成秒传的信息依据,形成秒传规则。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值