主要包含以下内容
1. 初识文件操作
2. 只读(r, rb)
3. 只写(w, wb)
4. 追加(a, ab)
5. r+读写
6. w+写读
7. a+写读(追加写读)
8. 其他操作⽅法
9. 文件的修改以及另一种打开文件句柄的方式
一. 初识⽂文件操作
使⽤用python来读写⽂件是非常简单的操作. 我们使⽤用open()函数来打开⼀个⽂文件, 获取到文 件句柄. 然后通过⽂件句柄就可以进⾏各种各样的操作了了. 根据打开方式的不同能够执⾏行的操作也会有相应的差异. 打开文件的⽅方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤用的是r(只读)模式
f = open("123.txt",mode="r", encoding="utf-8") content = f.read() print(content) f.close()
需要注意encoding表⽰示编码集. 根据⽂文件的实际保存编码进⾏行行获取数据, 对于我们⽽而⾔言. 更更 多的是utf-8
rb. 读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集.
f = open("123.txt" ,mode = "rb") content = f.read() print(content) f.close()
rb的作⽤用: 在读取非⽂文本⽂文件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要⽤用到 rb. 因为这种数据是没办法直接显⽰示出来的. 在后⾯面我们⽂文件上传下载的时候还会⽤用到. 还有.
我们看的直播. 实际上都是这种数据.
绝对路路径和相对路路径:
1. 绝对路路径:从磁盘根⽬目录开始⼀一直到⽂文件名.
2. 相对路路径:同⼀一个⽂文件夹下的⽂文件. 相对于当前这个程序所在的⽂文件夹⽽而⾔言. 如果在同 ⼀一个⽂文件夹中. 则相对路路径就是这个⽂文件名. 如果在上⼀一层⽂文件夹. 则要../
读取文件的方法:
1. read() 将⽂文件中的内容全部读取出来. 占内存. 易导致内存崩溃
2. read(n) 读取n个字符. 如果再次读取. 会在当前位置继续去读⽽而不 是从头读, 如果使⽤用的是rb模式. 则读取出来的是n个字节
3. readline() ⼀次读取⼀一⾏行数据, 注意每次读取出来的数据都会有⼀ 个\n . 需要我们使⽤用strip()⽅法来去掉\n或者空格
4. readlines()将每⼀⾏行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 易出现内存崩溃的问题
5. 循环读取. 这种⽅方式是组好的. 每次读取⼀⾏行内容.不会产生内存溢出的问题.
下面分别演示:
1 read() 将⽂文件中的内容全部读取出来
f = open("123.txt" ,mode = "r" , encoding="utf-8") content = f.read() # 默认将文件中的内容全部读取出来 print(content) f.close() 结果如下: CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议. 会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现. 质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。 他还说,他“事实上”是开除了马蒂斯。
2 read(n) 读取n个字符. 如果再次读取. 会在当前位置继续去读而不 是从头读, 如果使⽤用的是rb模式. 则读取出来的是n个字节
f = open("123.txt" ,mode = "r" , encoding="utf-8") content = f.read(10) print(content) content = f.read(10) #如果再次读取. 会在当前位置继续去读而不 是从头读, 如果使⽤用的是rb模式. 则读取出来的是n个字节 print(content) 结果如下: CNN援引这名美国官 员的话说,沙纳汉当天
3 readline() ⼀次读取⼀一⾏行数据, 注意每次读取出来的数据都会有⼀ 个\n . 需要我们使⽤用strip()⽅法来去掉\n或者空格
f = open("123.txt", mode="r", encoding="utf-8") content = f.readline() # 按行读出,若括号内有数字,代表只读每行x个字符 print(content) content1 = f.readline() # 按行读出,若括号内有数字,代表只读每行x个字符 print(content1) content2 = f.readline().strip() # 按行读出,若括号内有数字,代表只读每行x个字符,我们使⽤用strip()⽅法来去掉\n或者空格 print(content2) content3 = f.readline() # 按行读出,若括号内有数字,代表只读每行x个字符 print(content3) 结果如下: CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议. 会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现. 质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。 他还说,他“事实上”是开除了马蒂斯。
4 readlines()将每⼀⾏行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 易出现内存崩溃的问题.不推荐使用,且列表自带换行符号\n
f = open("123.txt", mode="r", encoding="utf-8") cont = f.readlines() # 亲测 汇总为一个列表元素 print(cont) f.close() f = open("123.txt", mode="r", encoding="utf-8") cont1 = f.readlines(1) # 亲测 只识别1行,2行为列表做不到 print(cont1) 结果如下: ['CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.\n', '会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现.\n', '质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。\n', '他还说,他“事实上”是开除了马蒂斯。'] ['CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.\n']
5 循环读取. 这种⽅方式是组好的. 每次读取⼀⾏行内容.不会产生内存溢出的问题. 读取文件一定要最终 f.close()
f = open("123.txt", mode="r", encoding="utf-8") lst1 = [] for line in f: lst1.append(line.strip()) # 清除换行符,并添加到lst1 中 print(line.strip()) print(lst1) 结果如下: CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议. 会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现. 质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。 他还说,他“事实上”是开除了马蒂斯。 ['CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.', '会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现.', '质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。', '他还说,他“事实上”是开除了马蒂斯。']
写模式
写的时候注意. 如果没有⽂文件. 则会创建⽂文件, 如果⽂文件存在. 则将原件中原来的内容删除, 再 写入新内容
f = open("123.txt", mode="w" ,encoding="utf-8") f.write("国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息") f.flush() # 刷新 好习惯 wb模式下. 可以不指定打开⽂文件的编码. 但是在写⽂文件的时候必须将字符串串转化成utf-8的 bytes数据 f = open("123.txt", mode="r", encoding="utf-8") content = f.read() # 写的时候注意. 如果没有⽂文件. 则会创建⽂文件, 如果⽂文件存在. 则将原件中原来的内容删除, 再 写入新内容 print(content) 结果如下: 国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息
追加(a, ab)
在追加模式下. 我们写入的内容会追加在⽂文件的结尾.
f = open("123.txt", mode="a" ,encoding="utf-8") f.write("该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。") f.flush() f.close() f = open("123.txt", mode="r" ,encoding="utf-8") content = f.read() print(content) 结果如下: 国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。
读写模式(r+, r+b)
对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进⾏行行 写入. 我们以后使⽤用频率最高的模式就是r+
f = open("123.txt", mode="r+" ,encoding="utf-8") content = f.read() f.write("11") #正常的读取之后, 写在结尾 f.flush() # 刷新 好习惯 print(content) 结果如下: 国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。中国铁路总公司股份制改造后将设董事会。杨宇栋继任后,国家铁路局副局长于春孝暂时负责国家铁路局工作。11
写读(w+, w+b)
先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常⽤用, w+ 模式下, ⼀一开始读取不到数据. 然后写的时候再将原来, 的内容清空. 所以, 很少⽤
f = open("123.txt", mode="w+" ,encoding="utf-8") f.write("11") #正常的读取之后, 写在结尾 content = f.read() f.flush() # 刷新 好习惯 print(content) 结果
追加读(a+)
a+模式下, 不论先读还是后读. 都是读取不到数据的.
f = open("123.txt", mode="a+" ,encoding="utf-8") f.write("11") #正常的读取之后, 写在结尾 content = f.read() f.flush() # 刷新 好习惯 print(content) f.close() 结果
其他操作- 光标移动
seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中⽂文部分要 是3的倍数
通常我们使⽤用seek都是移动到开头或者结尾.
- 移动到开头: seek(0)
- 移动到结尾: seek(0,2) seek的第⼆二个参数表⽰示的是从哪个位置进⾏行行偏移, 默认是0, 表 ⽰示开头, 1表⽰示当前位置, 2表⽰示结尾
f.tell() 使⽤用tell()可以帮我们获取到当前光标在什么位置
f.truncate() 截断⽂文件,后⾯面的所有内容全部都删掉
深坑请注意: 在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入 或者操作⽂文件的时候都是在结尾进⾏行行的操作.
修改⽂文件以及另⼀一种打开⽂文件的⽅方式
- ⽂文件修改: 只能将⽂文件中的内容读取到内存中, 将信息修改完毕, 然后将源⽂文件删除, 将新 ⽂文件的名字改成老⽂文件的名字.
import os with open("123", mode="r", encoding="utf-8") as f1, open("123_new", mode="w", encoding="utf-8") as f2: for line in f1: new_line = line.replace("你好", "中国") f2.write(new_line) os.remove("123") # 删除源⽂文件 os.rename("123_new", "123") # 重命名新⽂文件 # 将前面的名字 改为后面 的 名字 f = open("123", mode="r", encoding="utf-8") content = f.read() print(content) 结果如下: 中国