python文件操作详解

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 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('慢慢传去吧')
原文地址:https://www.cnblogs.com/fuwei8086/p/10610739.html