Python 文件操作可以归纳为三步:打开文件、读写文件、关闭文件。打开阶段使用 open 函数得到文件对象,读写阶段根据访问模式调用 read、readline、readlines、write 等方法,最后通过 close 关闭文件并释放资源。下面围绕打开关闭、读取、写入和追加四部分,结合示例说明常见参数、返回类型和容易踩坑的细节。
一、打开与关闭文件
open 的基本形式是:文件对象 = open(文件路径, 访问模式)。close 的形式是:文件对象.close()。访问模式决定文件被如何打开:r 为只读,也是默认模式;w 为写入,文件已存在时从开头写入并删除原有内容,文件不存在时创建新文件;a 为追加,文件已存在时把新内容写到原有内容之后,文件不存在时创建新文件。
例如准备 D:/pythonTestFile/test.txt,内容为两行 Hello World、Hello Python,执行打开和关闭:
- f = open("D:/pythonTestFile/test.txt", "r")
- print(f)
- print(type(f))
- f.close()
- # 输出结果
- # <_io.TextIOWrapper name='D:/pythonTestFile/test.txt' mode='r' encoding='cp936'>
- # <class '_io.TextIOWrapper'>
复制代码
从输出可以看出,open 返回的是 _io.TextIOWrapper 类型文件对象,示例环境使用 cp936 编码。文件路径、访问模式和编码都会影响后续读写行为。
二、读取文件的三种常用方法
read([长度]) 用于读取指定长度;不指定长度时读取文件中所有剩余数据。readline() 一次读取一行。readlines() 按行读取整个文件,并返回列表,每一行数据作为列表中的一个元素。
准备 readTest.txt,内容为 Hello World 1 到 Hello World 5 共五行。连续调用 read(10) 可以看出文件指针会向前移动:第一次读取 10 个长度,第二次从剩余位置继续读取,因此第二次结果会跨行。
- f = open("D:/pythonTestFile/readTest.txt", "r")
- result1 = f.read(10)
- result2 = f.read(10)
- resultAll = f.read()
- print(f"第 1 次读取 10 个字节:{result1}")
- print(type(result1))
- print(f"第 2 次读取 10 个字节:{result2}")
- print(type(result2))
- print(f"读取剩下的全部内容:{resultAll}")
- print(type(resultAll))
- f.close()
- # 输出结果
- # 第 1 次读取 10 个字节:Hello Worl
- # <class 'str'>
- # 第 2 次读取 10 个字节:d 1
- # Hello
- # <class 'str'>
- # 读取剩下的全部内容:World 2
- # Hello World 3
- # Hello World 4
- # Hello World 5
- # <class 'str'>
复制代码
readline 每次返回一行,返回类型为 str;readlines 返回 list,示例中列表元素带有换行符,例如 'Hello World 1\n'。因此使用 readlines 后如果不需要换行符,通常还要自行处理。
- f = open("D:/pythonTestFile/readTest.txt", "r")
- line1 = f.readline()
- line2 = f.readline()
- print(line1)
- print(type(line1))
- print(line2)
- print(type(line2))
- f.close()
- # 输出结果
- # Hello World 1
- # <class 'str'>
- # Hello World 2
- # <class 'str'>
复制代码- f = open("D:/pythonTestFile/readTest.txt", "r")
- lines = f.readlines()
- print(lines)
- print(type(lines))
- f.close()
- # 输出结果
- # ['Hello World 1\n', 'Hello World 2\n', 'Hello World 3\n', 'Hello World 4\n', 'Hello World 5']
- # <class 'list'>
复制代码
三、for 语句与 with 语句读取
文件对象可以直接用于 for 循环,按行迭代读取。with open(...) as ... 的写法除了简化代码,更重要的是离开 with 代码块后会自动关闭文件,适合替代手动调用 close。
- with open("D:/pythonTestFile/readTest.txt", "r") as f:
- for line in f:
- print(line)
- # 输出结果
- # Hello World 1
- # Hello World 2
- # Hello World 3
- # Hello World 4
- # Hello World 5
复制代码
如果采用普通 open 写法,遍历结束后仍要记得执行 f.close()。with 语句把关闭动作交给上下文管理,能减少忘记关闭文件导致的资源占用问题。
四、文件写入与 flush
写入使用 w 模式打开文件,再调用 write(内容)。write 写入的内容会先进入缓冲区,调用 flush 才会真正写入文件;close 自带 flush 功能,所以正常关闭文件也能把缓冲区内容写入磁盘。需要注意,w 模式会清空已有内容。
准备 writeTest.txt,原内容为 Hello World 1 到 Hello World 3 三行,执行以下代码后,原有三行会被覆盖:
- f = open("D:/pythonTestFile/writeTest.txt", "w")
- f.write("Hello Python")
- f.write("\n")
- f.write("Hello Python")
- f.flush()
- f.close()
- # 此时 writeTest.txt 文件内容为:
- # Hello Python
- # Hello Python
复制代码
五、文件追加
追加使用 a 模式打开文件,仍然调用 write 写入。与 w 不同的是,a 不会清空原有内容,而是把新内容追加到原有内容之后。write 后同样可以先 flush,再 close。
准备 appendTest.txt,原内容为 Hello World 1 到 Hello World 3 三行,执行追加:
- f = open("D:/pythonTestFile/appendTest.txt", "a")
- f.write("\n")
- f.write("Hello Python")
- f.write("\n")
- f.write("Hello Python")
- f.flush()
- f.close()
- # 此时 appendTest.txt 文件内容为:
- # Hello World 1
- # Hello World 2
- # Hello World 3
- # Hello Python
- # Hello Python
复制代码
六、常见问题与使用建议
第一,w 模式容易误覆盖原文件,如果只是追加内容应使用 a;第二,连续调用 read 或 readline 时,读取位置会持续前移,前一次读取会影响后一次结果;第三,写入后如果程序异常退出,缓冲区内容可能尚未落盘,flush 和 close 都关系到数据是否真正写入;第四,读取文本时返回 str,readlines 返回 list,处理换行符时要区分;第五,日常读写优先考虑 with 语句,减少忘记关闭文件的问题。示例中的输出显示 cp936 编码,实际处理中文文件时还应显式关注编码参数,避免不同环境读写结果不一致。 |