• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
麦兜家园
优秀是一种习惯
博客园    首页    新随笔    联系   管理    订阅  订阅

python中的文件操作

一、文件打开模式

模式

作用

文件不存在

原有内容

r

只读

报错

保留

w

只写,覆盖

创建

清空覆盖

a

只追加写

创建

保留,写在末尾

r+

可读可写

报错

保留

w+

可读可写,覆盖

创建

清空覆盖

a+

可读、可追加写

创建

保留;写强制在末尾

补充

  1. 1.+:在原有模式基础上,增加读 / 写能力。
  2. 2.b 二进制模式:处理图片、压缩包,不能指定 encoding。
  3. 3.t 文本模式,默认可省略,处理 txt 文本。
  4. 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')
		
# 最终的结果是:
# 春夜喜雨
# 好雨知时节,当春乃发生
# 迟日江山丽,春风花草香
# 爆竹声中一岁除,春风送暖入屠苏。
# 春风又绿江南岸,明月何时照我还。
# 春光无限好,只是近黄昏。
# 春眠
# 春眠不觉晓,处处闻啼鸟。
# 隔座送钩春酒暖,分曹射覆蜡灯红。

  所以总结:

  1. 只要读写磁盘文件对象,就要留意文件指针位置。
  2. read()读完后指针在末尾,如果继续读文件对象,要么再次seek(0),要么操作内存字符串。
  3. a+模式下,无论指针在哪,write 永远追加到文件末尾。
  4. 小文件:read()读进内存,用splitlines()处理行,是最简单稳妥的方式。
  5. 文件路径尽量使用原始字符串r"xxx",避免转义字符问题。
  6. 文本文件务必加上encoding='utf‑8',防止中文乱码。
  7. w模式打开就清空文件,使用要谨慎。
  8. 正式代码优先使用with open()上下文管理器。
posted on 2026-10-14 16:05  麦兜家园  阅读(4)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3