查看: 1267|回复: 3

Python文件读写教程:open模式、文件指针与编码避坑

[复制链接]
发表于 昨天 10:00 | 显示全部楼层 |阅读模式
Python 文件操作是脚本编程、日志处理和数据处理中很常见的需求。原文围绕内置 open() 函数,讲清了文件读取、写入、追加,以及一些容易踩坑的细节。下面按实际开发顺序重新梳理。

一、open() 打开文件与模式参数

open(file, mode='r', encoding=None) 用于打开文件并返回文件对象。file 是相对或绝对路径;mode 常用值有 'r' 只读、'w' 只写、'a' 追加;encoding 用于指定编码,文本文件建议固定为 utf-8,避免在 Windows 等环境下因默认 gbk 出现乱码或报错。
  1. f = open("word.txt", "r", encoding="utf-8")
  2. print(type(f)) # <class '_io.TextIOWrapper'>
复制代码

其中 'r' 是默认模式,文件指针在开头,文件不存在会报错;'w' 模式在文件存在时会清空覆盖原有内容,不存在则创建;'a' 模式在文件末尾追加内容,不存在则创建。

二、读取文件的几种方式

read(size) 用于读取内容。文本模式下 size 表示字符数,二进制模式下表示字节数;不传参数时读取文件全部内容。
  1. content = f.read() # 读取全部内容
  2. content_10 = f.read(10) # 读取前10个字符
复制代码

readline() 每次读取一行,返回内容自带换行符 \n,打印时容易出现空行,通常配合 strip() 去除换行和空格。
  1. line1 = f.readline()
  2. line2 = f.readline()
  3. print(line1.strip(), line2.strip()) # 一般配合strip去除换行和空格
复制代码

readlines() 会一次性读取所有行,并把每一行作为列表元素返回,适合小文件使用。
  1. lines = f.readlines()
  2. for line in lines:
  3.     print(line.strip())
复制代码

如果文件较大,更推荐直接 for 循环遍历文件对象。它是逐行读取,不会一次性把全部内容加载到内存,因此更内存友好。
  1. for line in f:
  2.     print(line.strip())
复制代码

三、close() 与 with open 上下文管理器

f.close() 用于关闭文件、释放系统资源。但如果代码中途报错,close() 可能不会执行,进而导致文件句柄泄露。因此实际写脚本时更推荐 with open 上下文管理器。
  1. with open("word.txt", "r", encoding="utf-8") as f:
  2.     for line in f:
  3.         print(line.strip())
  4. # 离开with代码块,文件自动关闭
复制代码

with 的好处是自动关闭文件、自动刷新缓冲区,代码更安全简洁,也能减少异常情况下的数据丢失和资源泄露。

四、写入模式 w 与追加模式 a

写入模式 'w' 是覆盖写入,打开文件时会清空原有内容。write() 不会自动换行,如果需要换行必须手动加 \n。write() 写入的内容会先进入内存缓冲区,不会立刻落盘;with 代码块结束时会自动刷新缓冲区并关闭文件,因此一般不需要手动 flush。
  1. with open("test.txt", "w", encoding="utf-8") as f:
  2.     f.write("hello world!")
复制代码

追加模式 'a' 会在文件末尾新增内容,不会覆盖原有数据。
  1. with open("test.txt", "a", encoding="utf-8") as f:
  2.     f.write("\nnew line")
复制代码

五、常见问题与错误纠正

1. read(size) 的字符与字节区别

文本模式读取的是字符数,不是字节数;只有二进制 rb、wb 模式读取或写入的才是字节数。新手很容易把两者混淆。

2. 文件指针停在末尾导致后续读取为空

如果先执行 read() 读完整文件,文件指针会停在末尾,后续 for 循环遍历将读不到任何内容。此时需要重新打开文件,或者用 seek(0) 重置指针。

3. 'w' 模式会清空文件

'w' 模式打开文件的瞬间就会清空原有内容,练习或处理数据时不要误用该模式操作原始数据文件。

4. 编码问题

所有文本文件操作都应明确指定 encoding="utf-8"。否则在 Windows 系统下可能使用默认 gbk 编码,容易出现乱码或报错。

六、总结

open() 的三大基础模式是 r 只读、w 覆盖写入、a 追加写入;处理文本文件务必指定 encoding="utf-8"。读取时按场景选择:大文件优先直接 for 循环遍历文件对象,小文件可以使用 read() 或 readlines()。注意文本模式按字符、二进制模式按字节,理解 read(size) 的差异。推荐优先使用 with open,自动关闭文件并刷新缓冲区,防止文件句柄泄露。还要牢记文件指针机制:读取完毕后指针在末尾,重复读取需要 seek(0) 或重新打开。最后警惕 'w' 模式风险,write() 不会自动追加换行,需要手动添加 \n。
回复

使用道具 举报

发表于 昨天 19:00 | 显示全部楼层

Re: Python文件读写教程:open模式、文件指针与编码避坑

整理得很系统,r、w、a 三种模式的区别和编码指定确实是最容易忽略的地方。我以前写文本处理时没加 encoding,在 Windows 上偶尔就乱码,后来统一 utf-8 才省心。文件指针那段也特别实用,read() 完之后再遍历为空,当时还以为是文件内容问题。with open 自动关闭和刷新缓冲区这点也很重要,写脚本时比手动 close 稳妥多了。还有 w 模式会直接清空文件,处理原始数据前真得反复确认。感谢分享,准备按这个清单再检查一遍自己的代码。
回复 支持 反对

使用道具 举报

发表于 昨天 19:10 | 显示全部楼层

Re: Python文件读写教程:open模式、文件指针与编码避坑

整理得很清楚,尤其是文件指针和编码这两块,确实是写脚本时容易忽略的地方。我之前处理日志文件时就被 'w' 模式坑过,本来只想写点东西,结果把原内容清空了,后来才养成先确认模式、重要文件先备份的习惯。还有 read() 读完后指针停在末尾,再遍历文件读不到内容,当时也觉得很奇怪,看到 seek(0) 和重新打开这段一下就明白了。现在写文本文件基本都会固定加上 encoding='utf-8',配合 with open 用起来安心很多。大文件优先用 for 逐行读也很实用,避免一次性把内容全加载进内存。感谢分享,后面再遇到文件读写问题可以回来对照检查。
回复 支持 反对

使用道具 举报

发表于 昨天 19:20 | 显示全部楼层

Re: Python文件读写教程:open模式、文件指针与编码避坑

这篇整理得挺清楚,收藏了。open 的 r、w、a 三种模式平时常用,但确实容易忽略 w 一打开就会清空文件,以及 write 不会自动换行,得手动加 \n 这两个坑。文本文件固定 encoding="utf-8" 也很关键,尤其在 Windows 上默认 gbk 时很容易乱码或报错。读取部分最有共鸣的是文件指针:read() 读完后指针停在末尾,再遍历就什么都读不到,需要 seek(0) 或重新打开。大文件直接用 for 循环遍历文件对象,小文件再用 read 或 readlines,这个选择思路很实用。with open 自动关闭并刷新缓冲区,比手动 close 更安全,也能减少异常情况下的资源泄露。整体总结得很系统,感谢分享。
回复 支持 反对

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

GMT+8, 2026-10-14 07:24 , Processed in 0.031930 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部