#控制文件读写内容的模式
'''
t;
1 读写都是以字符串(unicode)为单位的
2 只能针对文本文件
3 必须指定字符编码,即必须指定encoding参数
b:binary模式
1、读写都是以bytes为单位的
2 可以针对所有文件
3 一定不能指定字符编码,即一定不能指定encoding参数
总结:
1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需手动的进行编码与解码
2、针对非文本文件(如图片,视频,迎评等)只能使用b模式
'''
#错误演示:t模式只能读文本文件
# with open(r'e3f9d392728e092fa9a825cf89f8e42.jpg',mode='rt') as f:
# pass #不报错
# f.read() #硬盘的二进制读入内存-》 #报错
# t 模式会将读入内存的内容进行decode解码操作,报错
# with open(r'e3f9d392728e092fa9a825cf89f8e42.jpg',mode='rb') as f:#一定不能指定打开模式(encode='utf-8')
# res=f.read() #硬盘的二进制读入内存——》b模式下,不做任何转换,直接读入内存
# print(res,type(res)) #bytes类型--》当成二进制 输出:...<class 'bytes'>
#打开文本文件,不能加encoding=
# with open('b.txt',mode='rb') as f:
# res=f.read() #utf-8的二进制
# print(res,type(res))
# print(res.decode('utf-8'))
#上面相当于
# with open('b.txt',mode='rt',encoding='utf-8') as f:
# res=f.read() #utf-8的二进制
# print(res,type(res))
# with open(r'e.txt',mode='wb')as f:
# f.write('你好hello'.encode('gbk'))
#文件拷贝工具
src_file=input('源文件的绝对路径>>:').strip()
dst_file=input('目标文件的绝对路径>>:').strip()
with open(r'{}'.format(src_file),mode='rb') as f1,\
open(r'{}'.format(dst_file),mode='wb') as f2:
for line in f1: #每次读一行,上一行因为调用结束,在内存中自动释放了
f2.write(line)
#循环读取文件
#方式一:while循环,自己控制读入的数据量
# 当文件一行内容过长时,用这种方式,
# 因为不是用行为切分,而是指定字节长度来切分文件的
# with open(r'e3f9d392728e092fa9a825cf89f8e42.jpg',mode='rb') as f:
# while True:
# res=f.read(1024) #每次从当前位置开始往后读1024个字节
# if len(res) == 0: #或者 if not res 如果res为空则退出循环
# break
# print(len(res))
#方式二:以行为单位,当一行内容过长时,会导致一次性读入内存的数据量过大
# with open(r'b.txt',mode='rt',encoding='utf-8') as f:
# for line in f:
# print(line)
# with open(r'g.txt',mode='rb') as f:
# for line in f:
# print(line)
# with open(r'e3f9d392728e092fa9a825cf89f8e42.jpg',mode='rb') as f:
# for line in f:
# print(line)