查看: 254|回复: 3

Python文件读写:open模式与read/write实践

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
Python 文件操作可以归纳为三步:打开文件、读写文件、关闭文件。打开阶段使用 open 函数得到文件对象,读写阶段根据访问模式调用 read、readline、readlines、write 等方法,最后通过 close 关闭文件并释放资源。下面围绕打开关闭、读取、写入和追加四部分,结合示例说明常见参数、返回类型和容易踩坑的细节。

一、打开与关闭文件

open 的基本形式是:文件对象 = open(文件路径, 访问模式)。close 的形式是:文件对象.close()。访问模式决定文件被如何打开:r 为只读,也是默认模式;w 为写入,文件已存在时从开头写入并删除原有内容,文件不存在时创建新文件;a 为追加,文件已存在时把新内容写到原有内容之后,文件不存在时创建新文件。

例如准备 D:/pythonTestFile/test.txt,内容为两行 Hello World、Hello Python,执行打开和关闭:
  1. f = open("D:/pythonTestFile/test.txt", "r")
  2. print(f)
  3. print(type(f))
  4. f.close()
  5. # 输出结果
  6. # <_io.TextIOWrapper name='D:/pythonTestFile/test.txt' mode='r' encoding='cp936'>
  7. # <class '_io.TextIOWrapper'>
复制代码

从输出可以看出,open 返回的是 _io.TextIOWrapper 类型文件对象,示例环境使用 cp936 编码。文件路径、访问模式和编码都会影响后续读写行为。

二、读取文件的三种常用方法

read([长度]) 用于读取指定长度;不指定长度时读取文件中所有剩余数据。readline() 一次读取一行。readlines() 按行读取整个文件,并返回列表,每一行数据作为列表中的一个元素。

准备 readTest.txt,内容为 Hello World 1 到 Hello World 5 共五行。连续调用 read(10) 可以看出文件指针会向前移动:第一次读取 10 个长度,第二次从剩余位置继续读取,因此第二次结果会跨行。
  1. f = open("D:/pythonTestFile/readTest.txt", "r")
  2. result1 = f.read(10)
  3. result2 = f.read(10)
  4. resultAll = f.read()
  5. print(f"第 1 次读取 10 个字节:{result1}")
  6. print(type(result1))
  7. print(f"第 2 次读取 10 个字节:{result2}")
  8. print(type(result2))
  9. print(f"读取剩下的全部内容:{resultAll}")
  10. print(type(resultAll))
  11. f.close()
  12. # 输出结果
  13. # 第 1 次读取 10 个字节:Hello Worl
  14. # <class 'str'>
  15. # 第 2 次读取 10 个字节:d 1
  16. # Hello
  17. # <class 'str'>
  18. # 读取剩下的全部内容:World 2
  19. # Hello World 3
  20. # Hello World 4
  21. # Hello World 5
  22. # <class 'str'>
复制代码

readline 每次返回一行,返回类型为 str;readlines 返回 list,示例中列表元素带有换行符,例如 'Hello World 1\n'。因此使用 readlines 后如果不需要换行符,通常还要自行处理。
  1. f = open("D:/pythonTestFile/readTest.txt", "r")
  2. line1 = f.readline()
  3. line2 = f.readline()
  4. print(line1)
  5. print(type(line1))
  6. print(line2)
  7. print(type(line2))
  8. f.close()
  9. # 输出结果
  10. # Hello World 1
  11. # <class 'str'>
  12. # Hello World 2
  13. # <class 'str'>
复制代码
  1. f = open("D:/pythonTestFile/readTest.txt", "r")
  2. lines = f.readlines()
  3. print(lines)
  4. print(type(lines))
  5. f.close()
  6. # 输出结果
  7. # ['Hello World 1\n', 'Hello World 2\n', 'Hello World 3\n', 'Hello World 4\n', 'Hello World 5']
  8. # <class 'list'>
复制代码

三、for 语句与 with 语句读取

文件对象可以直接用于 for 循环,按行迭代读取。with open(...) as ... 的写法除了简化代码,更重要的是离开 with 代码块后会自动关闭文件,适合替代手动调用 close。
  1. with open("D:/pythonTestFile/readTest.txt", "r") as f:
  2.     for line in f:
  3.         print(line)
  4. # 输出结果
  5. # Hello World 1
  6. # Hello World 2
  7. # Hello World 3
  8. # Hello World 4
  9. # Hello World 5
复制代码

如果采用普通 open 写法,遍历结束后仍要记得执行 f.close()。with 语句把关闭动作交给上下文管理,能减少忘记关闭文件导致的资源占用问题。

四、文件写入与 flush

写入使用 w 模式打开文件,再调用 write(内容)。write 写入的内容会先进入缓冲区,调用 flush 才会真正写入文件;close 自带 flush 功能,所以正常关闭文件也能把缓冲区内容写入磁盘。需要注意,w 模式会清空已有内容。

准备 writeTest.txt,原内容为 Hello World 1 到 Hello World 3 三行,执行以下代码后,原有三行会被覆盖:
  1. f = open("D:/pythonTestFile/writeTest.txt", "w")
  2. f.write("Hello Python")
  3. f.write("\n")
  4. f.write("Hello Python")
  5. f.flush()
  6. f.close()
  7. # 此时 writeTest.txt 文件内容为:
  8. # Hello Python
  9. # Hello Python
复制代码

五、文件追加

追加使用 a 模式打开文件,仍然调用 write 写入。与 w 不同的是,a 不会清空原有内容,而是把新内容追加到原有内容之后。write 后同样可以先 flush,再 close。

准备 appendTest.txt,原内容为 Hello World 1 到 Hello World 3 三行,执行追加:
  1. f = open("D:/pythonTestFile/appendTest.txt", "a")
  2. f.write("\n")
  3. f.write("Hello Python")
  4. f.write("\n")
  5. f.write("Hello Python")
  6. f.flush()
  7. f.close()
  8. # 此时 appendTest.txt 文件内容为:
  9. # Hello World 1
  10. # Hello World 2
  11. # Hello World 3
  12. # Hello Python
  13. # Hello Python
复制代码

六、常见问题与使用建议

第一,w 模式容易误覆盖原文件,如果只是追加内容应使用 a;第二,连续调用 read 或 readline 时,读取位置会持续前移,前一次读取会影响后一次结果;第三,写入后如果程序异常退出,缓冲区内容可能尚未落盘,flush 和 close 都关系到数据是否真正写入;第四,读取文本时返回 str,readlines 返回 list,处理换行符时要区分;第五,日常读写优先考虑 with 语句,减少忘记关闭文件的问题。示例中的输出显示 cp936 编码,实际处理中文文件时还应显式关注编码参数,避免不同环境读写结果不一致。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Python文件读写:open模式与read/write实践

感谢分享,这篇把文件操作的三步和几种读取方式讲得很清楚,尤其是连续 read(10) 展示文件指针移动那段,对理解读取位置很有帮助。我刚开始用的时候也踩过 readlines 的坑,返回的列表元素都带着换行符,直接拼接或比较时容易出问题,通常要自己再处理一下。 另外看到示例输出里编码是 cp936,实际项目里如果文件编码和运行环境不一致,读中文时可能会出现乱码,建议 open 的时候顺手加上 encoding 参数,这样在不同机器上更稳一些。with 语句那部分也说得很到位,自动关闭确实能省不少心,比手动 close 更不容易忘。 写入部分关于缓冲区和 flush 的说明挺有用的,以前只知道写完要 close,不太清楚 flush 的时机,看完更明白了。整体内容对入门和复习都很友好,期待后续再多分享一些实际场景下的小技巧。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Python文件读写:open模式与read/write实践

这篇整理得挺清楚的,尤其把 read、readline、readlines 的返回类型和文件指针移动讲明白了,read(10) 连续调用那个例子很直观。with open 自动关闭和 w 模式会覆盖原内容这两点也很关键。一个小建议:写入部分最后 flush 的示例如果能补上 close 或改用 with open 收尾会更完整,因为实际写文件时还是推荐用上下文管理,避免忘记关闭。整体很适合入门复习。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: Python文件读写:open模式与read/write实践

楼主这篇整理得挺系统的,打开关闭、三种读法、for/with 迭代、写入 flush 都覆盖到了,示例输出也很直观,对新手理解文件指针移动和返回类型很有帮助。 顺着内容补充几点实践中的小提醒:一是 with open 确实更推荐,尤其是读文件时忘记 close 很容易出现资源占用或写入未落盘的问题;二是在 open 里显式写上 encoding='utf-8' 会更稳妥,楼主示例环境是 cp936,换到别的系统或处理中文内容时容易出编码问题;三是 readlines 返回的元素带换行符,后续处理时用 rstrip 去掉比较方便;四是 w 模式覆盖原内容这点一定要提前确认文件路径,避免误清空,追加场景记得用 a;五是 flush 只是把缓冲区内容推给系统,真正释放文件句柄还是靠 close,所以 with 块结束自动关闭更省心。另外文本模式下 read(10) 读的是字符数,不是字节数,遇到多字节字符时表现会和直觉稍有差别,这点也值得留意。整体来说是很实用的入门总结,期待后续继续补充异常处理和路径相关的部分。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-5 08:20 , Processed in 0.021503 second(s), 28 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部