文件的操作
-
初识
''' open 内置函数,open底层调用的是操作系统的接口 f1,变量,f1,fh,file_handler,f_h,文件句柄。对文件进行的任何操作,都得通过文件句柄 encoding:可以不写,不写参数,默认编码本:操作系统默认的编码 windows:gbk linux: utf-8 macos: utf-8 f1.close() 关闭文件句柄 文件操作三步: 1,打开文件 2,对文件句柄进行相应的操作 3,关闭文件 ''' f1 = open('f:\联系方式.txt', encoding='utf-8', mode='r') content = f1.read() print(content) f1.close()
-
报错原因
- UnicodeDecodeError:文件存储时与文件打开时的编码本运用不一致
- 路径如果出现问题:f1 = open(r'f:\联系方式.txt', encoding='utf-8', mode='r'),字符串前面加个r就解决了
- 文件名不要用数字开头
-
文件操作的读
-
r,rb,r+,r+b...
# 文件操作的读,有四种模式 # r rb r+ r+b # read 全部读出来 ** # , mode='r'可以默认不写,不写就是读的打开方式 # f = open('文件的读', encoding='utf-8') # content = f.read() # print(content) # f.close() # 一定要写close,一定要写 一定要写 # read(n) 按照字符读取 # f = open('文件的读', encoding='utf-8') # content = f.read(8) # Murphy是最 # print(content) # f.close() # readline() 按行读 # f = open('文件的读', encoding='utf-8') # # # content = f.readline() # # print(f.readline()) # # print(f.readline()) # # print(f.readline()) # # print(f.readline()) # # f.close() # readlines() 多行读取,返回一个列表,列表中的每一个元素是原文件的每一行 # f = open('文件的读', encoding='utf-8') # l1 = f.readlines() # print(l1) # ['Murphy是最帅的\n', 'Murphy是我的英文名\n', '我就是陈年的小纯洁\n', '我已经34岁了,今年年底35岁,\n', '几个月时间争取把python拿下'] # f.close() # for 读取 相比上面的方法,这个方法最优,***** # 这样循环不论文件有多大,都只占line的一行内存 # f = open('文件的读', encoding='utf-8') # 类比为列表 # for line in f: # print(line) # f.close() # rb:操作的是非文本的文件 ,图片,视频,音频 # rb模式不用写encoding f = open('luoli.jpg', mode='rb') content = f.read() print(content) f.close()
-
-
文件操作的写
-
w, wb, w+, w+b四种模式
# 文件的写,w # 没有文件创建文件写入内容 # f = open('文件的写', encoding='utf-8', mode='w') # f.write('随便写点啥') # f.close() # 如果文件存在,先清空原文件内容,再写入新内容 # f = open('文件的写', encoding='utf-8', mode='w') # f.write('Murphy最帅!!!!!!') # f.close() # wb操作非文本类文件 # 首先要以byte类型把文件读出来 f = open('luoli.jpg', mode='rb') content = f.read() # print(content) f.close() # 将读出来的byte类型写入新文件中 f1 = open('luoli1.jpg', mode='wb') f1.write(content) f1.close()
-
-
文件操作的追加
-
a, ab, a+, a+b 四种模式
# a 没有文件创建文件,追加内容 # f = open('文件的追加', encoding='utf-8', mode='a') # f.write('Murphy最帅') # f.close() # 有文件直接追加 f = open('文件的追加', encoding='utf-8', mode='a') f.write('\n爱好python') f.close()
-
-
文件操作的其它模式
# r+ 读写:【必须】先读后写(追加) 在这个模式下如果先写后读,会产生覆盖, # 并且如果字符样式对不上会报错,比如我写入的逗号覆盖中文就会报错,原文件也会乱码 f = open('文件的读写', encoding='utf-8', mode='r+') content = f.read() f.write('人的一切痛苦,本质都是对自己无能的愤怒') f.close()
-
文件操作的其它功能
-
总结:
三个大方向:
读,四种模式:r,rb,r+,r+b
写,四种模式:w, wb, w+, w+b
追加四种模式:a, ab, a+, a+b
相应的功能:对文件句柄的操作:read(), read(n), readline(), readlines(),write(),
tell()是获取光标的位置 单位:字节
seek()调整光标的位置 单位:字节
flush
# flush 强制刷新 f = open('文件的其它功能', encoding='utf-8', mode='w') f.write('fjdlskjflksjdwef') f.flush() # write后跟一个flush f.close()
-
-
打开文件的另一种方式
# 优点1:不用手动关闭文件句柄 with open('文件的读', encoding='utf-8') as f1: print(f1.read()) # 优点2:可以一次操作多个文件句柄 with open('文件的读',encoding='utf-8') as f1, \ open('文件的写', encoding='utf-8', mode='w') as f2: print(f1.read()) f2.write('fdlksjfkljelskfj') # 缺点
-
文件操作的改
''' 1.以读的方式打开原文件 2.以写的模式创建一个新文件 3.将原文件的内容读出来修改成新内容,写入新文件 4.将原文件删除 5.将新文件重命名为原文件名 ''' # low版 一旦涉及到大文件,直接干爆内存 # import os # # 1.以读的方式打开原文件 # # 2.以写的模式创建一个新文件 # with open('alex自述',encoding='utf-8') as f1, \ # open('alex自述.bak',encoding='utf-8',mode='w') as f2: # # 3.将原文件的内容读出来修改成新内容,写入新文件 # old_content = f1.read() # new_content = old_content.replace('alex', 'SB') # f2.write(new_content) # os.remove('alex自述') # os.rename('alex自述.bak', 'alex自述') # 进阶版 import os # 1.以读的方式打开原文件 # 2.以写的模式创建一个新文件 with open('alex自述',encoding='utf-8') as f1, \ open('alex自述.bak',encoding='utf-8',mode='w') as f2: # 3.将原文件的内容读出来修改成新内容,写入新文件 for line in f1: # 第一次循环第一行,以此类推,每次只读一行,节省内存 new_line = line.replace('SB', 'alex') f2.write(new_line) # 写一行(读一行写一行,一行一行执行) os.remove('alex自述') os.rename('alex自述.bak', 'alex自述') # 有关清空的问题:在没有关闭文件句柄的情况下,会一直写下去,直到关闭 # 所以上面for循环中的时候不会关闭句柄,直到循环结束,相当于一直写直到结束循环