python中的文件操作
一、文件打开模式
|
模式 |
作用 |
文件不存在 |
原有内容 |
|---|---|---|---|
|
r |
只读 |
报错 |
保留 |
|
w |
只写,覆盖 |
创建 |
清空覆盖 |
|
a |
只追加写 |
创建 |
保留,写在末尾 |
|
r+ |
可读可写 |
报错 |
保留 |
|
w+ |
可读可写,覆盖 |
创建 |
清空覆盖 |
|
a+ |
可读、可追加写 |
创建 |
保留;写强制在末尾 |
补充
-
1.
+:在原有模式基础上,增加读 / 写能力。 -
2.
b二进制模式:处理图片、压缩包,不能指定 encoding。 -
3.
t文本模式,默认可省略,处理 txt 文本。 -
4.
a+注意:seek()只影响读取,写入永远追加到文件末尾。
二、关键概念:文件指针
-
•文件指针标记当前读写位置,
write()、read()、for line in 文件对象都会移动指针。 -
•写完内容之后,指针停在文件末尾;此时直接读取,会读到空数据。
-
•
seek(0):把指针重置回到文件开头。 -
•
read()读取完全部内容后,指针会停留在末尾。
重要区分
-
•
text = fr.read():text是内存字符串副本,不受指针影响。 -
•
for line in fr:直接操作磁盘文件对象 fr,受文件指针控制。
实操经验:小文件优先一次性读入内存,后续操作字符串,减少反复操作文件指针,避免各种空数据问题。 使用
字符串.splitlines()将完整文本按换行切割成行列表。
三、flush ()
fr.flush()
写入的数据先存放在内存缓冲区,不会立刻落盘; flush()强制将缓冲区内容写入磁盘。 使用with open()时,退出上下文会自动执行 flush 和 close。
四、普通 open 写法(练习用)
需求:a + 追加写入古诗,读取全部内容,筛选包含 “春” 的行写入备份文件
fr = open(r'F:/doc/鸿雁公司活动类/团队读书分享/test.txt', 'a+', encoding='utf-8')
# 追加写入内容
fr.write("""元日
爆竹声中一岁除,春风送暖入屠苏。
千门万户曈曈日,总把新桃换旧符。
泊船瓜洲
京口瓜洲一水间,钟山只隔数重山。
春风又绿江南岸,明月何时照我还。
登乐游原
向晚意不适,驱车登古原,
春光无限好,只是近黄昏。
春眠
春眠不觉晓,处处闻啼鸟。
夜来风雨声,花落知多少。
无题二首(其一)
昨夜星辰昨夜风,画楼西畔桂堂东。
身无彩凤双飞翼,心有灵犀一点通。
隔座送钩春酒暖,分曹射覆蜡灯红。
嗟余听鼓应官去,走马兰台类转蓬。""")
fr.flush()
# 指针回到开头,读取全部内容到内存
fr.seek(0)
text = fr.read()
fr.close() # 读完直接关闭原文件
# 遍历内存字符串筛选内容,写入备份
fw = open(r'F:/doc/鸿雁公司活动类/团队读书分享/test.txt.bak', 'w', encoding='utf-8')
for line in text.splitlines():
line = line.strip()
print(line)
if '春' in line:
fw.write(line + '\n')
fw.close()
五、推荐生产写法 with open ()
优势:不需要手动close(),代码块结束自动关闭文件,防止忘记关闭导致文件占用。
file_path = r'F:/doc/鸿雁公司活动类/团队读书分享/test.txt'
bak_path = r'F:/doc/鸿雁公司活动类/团队读书分享/test.txt.bak'
with open(file_path, 'a+', encoding='utf-8') as fr:
fr.write("""元日
爆竹声中一岁除,春风送暖入屠苏。
千门万户曈曈日,总把新桃换旧符。
泊船瓜洲
京口瓜洲一水间,钟山只隔数重山。
春风又绿江南岸,明月何时照我还。
登乐游原
向晚意不适,驱车登古原,
春光无限好,只是近黄昏。
春眠
春眠不觉晓,处处闻啼鸟。
夜来风雨声,花落知多少。
无题二首(其一)
昨夜星辰昨夜风,画楼西畔桂堂东。
身无彩凤双飞翼,心有灵犀一点通。
隔座送钩春酒暖,分曹射覆蜡灯红。
嗟余听鼓应官去,走马兰台类转蓬。""")
fr.flush()
fr.seek(0)
text = fr.read()
with open(bak_path, 'w', encoding='utf-8') as fw:
for line in text.splitlines():
line = line.strip()
if '春' in line:
fw.write(line + '\n')
# 最终的结果是:
# 春夜喜雨
# 好雨知时节,当春乃发生
# 迟日江山丽,春风花草香
# 爆竹声中一岁除,春风送暖入屠苏。
# 春风又绿江南岸,明月何时照我还。
# 春光无限好,只是近黄昏。
# 春眠
# 春眠不觉晓,处处闻啼鸟。
# 隔座送钩春酒暖,分曹射覆蜡灯红。
所以总结:
- 只要读写磁盘文件对象,就要留意文件指针位置。
read()读完后指针在末尾,如果继续读文件对象,要么再次seek(0),要么操作内存字符串。a+模式下,无论指针在哪,write 永远追加到文件末尾。- 小文件:
read()读进内存,用splitlines()处理行,是最简单稳妥的方式。 - 文件路径尽量使用原始字符串
r"xxx",避免转义字符问题。 - 文本文件务必加上
encoding='utf‑8',防止中文乱码。 w模式打开就清空文件,使用要谨慎。- 正式代码优先使用
with open()上下文管理器。
浙公网安备 33010602011771号