DAY8 文件操作(二)
一.写
1.1写文件
# 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.2 文件的复制
# 文本类型文件的复制
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()
1.3 with打开
# 用with open语法如何处理?
# r+: 不会创建文件的可读可写 | w+:创建清空文件的可读可写 | a+:创建不清空文件(追加)的可读可写
# 将文件的关闭交给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()
1.4 非文本文件的复制
# 如果复制非文本类型的数据文件?
# 从模式采用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+
三.游标操作
方法:seek(偏移量, 偏移位置)
偏移量:移动的字节数,负数是结合模式1,2往前偏移
偏移位置:
-- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移
3.1 游标读
with open('source.txt', 'rb') as f:
d1 = f.read(11)
print(d1)
print(d1.decode('utf-8'))
3.2 当前游标的位置
print(f.tell())
3.3 游标操作 - 从末尾位置开始
f.seek(-3, 2)
d2 = f.read()
print(d2.decode('utf-8')) # 890
3.4 游标操作 - 从当前位置开始
f.seek(-3, 1)
d2 = f.read()
print(d2.decode('utf-8')) # 34567890
3.5 游标操作 - 从头开始
f.seek(3, 0)
d2 = f.read()
print(d2)
print(d2.decode('utf-8')) # 好1234567890
3.6 游标写:会覆盖书写
with open('source.txt', 'rb+') as f:
f.seek(11)
# print(f.read())
f.write(b'000')