12---文件操作2
一。文件操作----控制文件读写内容的两种模式
控制文件读写内容的模式 t: 1、读写都是以字符串(unicode)为单位 2、只能针对文本文件 3、必须指定字符编码,即必须指定encoding参数 b:binary模式 1、读写都是以bytes为单位 2、可以针对所有文件 3、一定不能指定字符编码,即一定不能指定encoding参数
二。b模式
# b模式---文本文件 # rb 只读模式 with open('a','rb') as f: res = f.read() # 直接将硬盘中的二进制不做任何转换读入内存,在解释器处理过后,会输出一串16进制(字母和数字除外) print(res) # 直接输出文件内容而不是输出一串16进制 with open('a','rb') as f: # 需要对res进行解码,以什么格式存就以什么格式取 res = f.read().decode('utf-8') print(res) # wb 只写模式,必须对写入文件的内容进行编码,否则会报错 with open('a','wb') as f: f.write('qqq\n哈哈\n123\n'.encode()) # ab 只追加写,同样必须对写入文件的内容进行编码 with open('a','ab') as f: f.write('qqq\n哈哈\n123\n'.encode())
# b模式---图片/视频的复制 with open(r'C:\Users\GuiGui\Desktop\timg.jpg','rb') as f,\ open(r'C:\Users\GuiGui\Desktop\timg-2.jpg','wb') as f1: res = f.read() print(res) f1.write(res)
三。t模式和b模式的对比
总结:
1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
2、针对非文本文件(如图片、视频、音频等)只能使用b模式
四。循环读取文件的方式
# 方式一---for循环:以行为单位读,当一行内容过长时会导致一次性读入内容的数据量过大 # 1/rb模式 with open('a','rb') as f: for line in f: print(line) print(line.decode()) # 2/rt模式 with open('a','r',encoding='utf-8') as f: for line in f: print(line,end = '') print(line.encode('utf-8')) # 方式二---while循环:自己控制每次加载到内存的数据量 # rb模式 with open('a','rb') as f: while True: # read()可以指定每次读取的字节数 res = f.read(1) if len(res) == 0: break print(res) # rt模式 with open('a','rt',encoding='utf-8') as f: while True: # read()可以指定每次读取的字符数 res = f.read(1) if len(res) == 0: break
五。文件操作的其他方式
1、读的相关操作
# 1、readline() 一次读一行
# rt模式 with open('a','r',encoding='utf-8') as f: # res = f.readline() # print(res) while True: line = f.readline() if len(line) == 0: break print(line)
# rb模式 with open('a','rb') as f: # res = f.readline() # print(res) while True: line = f.readline() if len(line) == 0: break print(line) # 2、readlines()将打开的文本文件中的每行内容添加到列表中 # rt模式 with open('a','r',encoding='utf-8') as f: res = f.readlines() print(res) # rb模式 with open('a', 'rb') as f: res = f.readlines() print(res)
# 强调: # f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出 # 如果想将大文件的内容读入内存,建议使用循环读取文件的方法。
2、写的相关操作
# wt模式 with open('a','w',encoding='utf-8') as f: # 需要自己写换行符 # f.write('111\n222\n') # 注意对文本文件的IO操作都是字符串,所以列表中的数字必须是字符串 l = ['111\n','222\n'] f.writelines(l) # wb模式 with open('a','wb') as f: # 因为是b模式,所以写入的数据必须是bytes(二进制)类型 l = [ '我是汉字\n'.encode('utf-8'), '所以要编码成二进制格式\n'.encode('utf-8'), ] f.writelines(l) # 如果是纯数字或者纯英文,可以按照以下格式写,也可以按照汉字的编码方式 l = [ b'123\n', b'hello\n' ] f.writelines(l)
3、flush,会将执行完写操作的文件马上存入硬盘
# 当对一个文件进行写操作的时候,操作系统并不会立刻把写的文件存入硬盘,而是会攒够一定数量一起存入硬盘 # 注意:在文本编辑器上接着之前的内容写,不是追加写,而是对加载到内存的文件进行覆盖 with open('a','w',encoding='utf-8') as f: f.write('哈') f.flush()
4、需要了解的其他操作
f.readable() # 文件是否可读 f.writable() # 文件是否可读 f.closed # 文件是否关闭 f.encoding # 如果文件打开模式为b,则没有该属性 f.flush() # 立刻将文件内容从内存刷到硬盘 f.name
六。文件的高级操作---控制文件指针的移动
1、f.tell() ----指针当前的位置
2、控制指针的移动
# 指针的移动都是以字节bytes为单位 # 例外情况:t模式下的read(n),n是指每次读取几个字符 # with open('a','r',encoding='utf-8') as f: # res = f.read(2) # print(res) # 强调:只有0模式可以在t下使用,1、2模式必须在b模式下用 # f.seek(n,模式) n是根据后面的模式移动的字节数 # 0 模式,参照物是文件开头的位置 with open('a','r',encoding='utf-8') as f: f.seek(4,0) res = f.tell() print(res) # 1 模式,参照物是当前指针所在位置 with open('a','rb') as f: print(f.tell()) f.seek(3,1) print(f.tell()) f.seek(4,1) print(f.tell()) # 2 模式,参照物是文件末尾位置,应该倒着移动 with open('a','rb') as f: print(f.tell()) f.seek(0,2) print(f.tell()) f.seek(-3,2) print(f.tell())