当前位置:首页>python>Python 读写文本(一)

Python 读写文本(一)

  • 2026-09-26 23:24:56
Python 读写文本(一)
Python读取文本内容方法:使用open()方法
# 1. 打开文件f = open("文件路径", "r", encoding="utf-8")# 2. 读取内容content = f.read()# 3. 关闭文件(必须!否则会占用系统资源)f.close()
open参数:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • file:文件路径。例如E:\read_file\text.txt
  • model:这个参数是用来指定文件的打开方式(读 / 写 / 追加、文本 / 二进制模式等;
基础模式(读/写/追加),
格式模式(文本t/二进制b),可省略默认是文本。
mode 值
完整含义
关键特点
'r'
只读模式(文本),等价于 'rt'
1. 默认模式;2. 文件必须存在,否则报错;3. 指针在文件开头
'rb'
只读模式(二进制)
读取字节流(如图片 / 视频),不涉及编码,返回 bytes 类型
'w'
只写模式(文本),等价于 'wt'
1. 文件不存在则创建;2. 文件存在则清空原有内容;3. 指针在文件开头
'wb'
只写模式(二进制)
写入字节流,用于保存图片 / 视频 / 二进制数据
'a'
追加模式(文本),等价于 'at'
1. 文件不存在则创建;2. 写入内容追加到文件末尾;3. 指针在文件末尾
'ab'
追加模式(二进制)
向二进制文件末尾追加字节流
'r+'
读写模式(文本)
1. 文件必须存在;2. 可同时读和写;3. 指针在开头,写入会覆盖原有内容
'rb+'
读写模式(二进制)
二进制格式的读写,适用于非文本文件
'w+'
读写模式(文本)
1. 文件不存在则创建;2. 先清空文件;3. 可读写,指针在开头
'wb+'
读写模式(二进制)
清空二进制文件后读写
'a+'
读写模式(文本)
1. 文件不存在则创建;2. 写入追加到末尾;3. 读取需先移动指针(seek())
'ab+'
读写模式(二进制)
二进制格式的追加 + 读取
'x'
独占创建模式(文本),等价于 'xt'
1. 文件不存在则创建并以只写模式打开;2. 文件已存在则报错(避免覆盖)
'xb'
独占创建模式(二进制)
二进制格式的独占创建,防止误覆盖已有文件
  • buffering:这个参数主要和文件读写时的缓冲区机制相关,是优化文件 I/O性能的关键文件读写是慢速的 I/O 操作,如果每次只读写 1 个字节就和硬盘交互,效率会极低。buffering 参数用来控制缓冲区的大小,buffering 支持整数 / 特殊值,不同取值对应不同的缓冲策略:
取值
含义
buffering=-1
(默认)
使用系统默认的缓冲策略:1. 文本文件:行缓冲(遇到换行符 \n 刷新)2. 二进制文件:固定大小缓冲区(通常 4096/8192 字节)
buffering=0
关闭缓冲(仅对二进制文件有效):数据直接读写硬盘,无缓冲区
buffering=1
行缓冲(仅对文本文件有效):遇到 \n 时刷新缓冲区,立即写入 / 读取
buffering>1
自定义缓冲区大小(单位:字节):缓冲区满时才刷新,数值越大交互越少
  • buffering控制文件 I/O 的缓冲区机制,核心是减少硬盘交互、提升效率;
  • 默认值 -1 适配多数场景,无需手动调整;
  • 特殊场景可针对性设置:实时写用 1/0,大文件用 >1 的自定义大小。
  • encoding:计算机存储文件时,本质是存储二进制字节(0/1),而我们读写的文本是字符(如中文、英文、符号)。encoding 参数就是定义:
  • 读文件:把硬盘里的二进制字节,按照指定编码 “翻译” 成人类能看懂的字符串(str);
  • 写文件:把字符串(str)按照指定编码 “翻译” 成二进制字节,再存入硬盘。
如果不指定 encoding,Python 会使用系统默认编码(Windows 通常是 gbk,Linux/macOS 通常是 utf-8),这是导致中文等非 ASCII 字符乱码的最常见原因。
编码格式
核心特点
适用场景
utf-8
最通用的编码,兼容所有语言(中文、英文、符号等),占用空间灵活
绝大多数场景(推荐优先使用),如跨平台文件、网页、程序配置
gbk
/gb2312
中文专用编码,对中文支持更好,占用空间比 utf-8 略小
仅 Windows 系统下的旧文件、中文专用文档
ascii
仅支持英文字母、数字、基本符号,不支持中文
纯英文文本,不推荐用于含非 ASCII 字符的文件
utf-16
固定双字节编码,支持所有语言,占用空间更大
少数系统 / 软件的专用文件(如某些 Windows 系统文件)
  • errors:当文件读写过程中遇到编码 / 解码错误时,程序该如何处理这些错误(比如忽略、替换乱码字符,或直接报错);我们知道 encoding 负责字符和字节的转换,但若文件中的二进制字节不符合指定的编码规则(比如用 utf-8 读取一个 gbk 编码的乱码字节),就会触发 UnicodeDecodeError/UnicodeEncodeError。errors 参数就是用来定义这种错误的处理策略,避免程序直接崩溃,同时灵活控制乱码的处理方式。
errors 取值
核心行为
适用场景
strict
(默认)
遇到编码 / 解码错误时,直接抛出 UnicodeError 异常,程序终止
严格场景(如重要数据读写),要求编码完全正确,不允许乱码
ignore
忽略错误的字符,直接跳过,不报错、不替换
非关键文本读取(如日志文件),允许丢失少量乱码字符
replace
用 �(替换符)替代错误的字符
需保留文本结构,允许用占位符替代乱码(如展示网页文本)
backslashreplace
用 Python 的反斜杠转义序列(如 \x80)替代错误字符
调试场景,需保留错误字节的原始信息
surrogateescape
用 Unicode 代理字符替代错误字节,读取后可还原原始字节
处理系统文件(如 Windows 注册表)的特殊编码
xmlcharrefreplace
用 XML 字符引用(如 �)替代错误字符
生成 XML/HTML 文件时,避免乱码破坏标签结构
namereplace
用 \N{...} 形式的 Unicode 名称替代错误字符
调试 / 日志记录,明确标识错误字符的类型
  • newline:用来控制文件读写时换行符的处理规则—— 包括输入(读取)时如何解析换行符,以及输出(写入)时如何转换换行符,

    不同操作系统的换行符标准不同:

  •     Windows:用 \r\n(回车 + 换行)表示换行;
  •     Linux/macOS:用 \n(换行)表示换行;
  •     老旧 Mac 系统:用 \r(回车)表示换行。
  •     newline参数为了统一跨平台的换行符处理逻辑,避免读取windows文本文  件时出现多余的\r,或写入文件时换行符不兼容目标系统。
newline 取值
读取(输入)时的行为
写入(输出)时的行为
None
(默认)
1. 把 \n、\r\n、\r 都解析为 \n;2. 自动忽略换行符前后的空白(跨平台兼容)
把代码中的 \n 替换为系统默认换行符(Windows→\r\n,Linux/macOS→\n)
''
(空字符串)
1. 解析规则同 None(兼容所有换行符);2. 保留原始换行符的所有字节(不忽略空白)
不替换 \n,直接写入代码中的换行符(\n 就是 \n)
'\n'
仅把 \n 视为换行符,\r 会被当作普通字符保留
直接写入 \n,不做任何替换
'\r'
仅把 \r 视为换行符,解析为 \n
把代码中的 \n 替换为 \r
'\r\n'
仅把 \r\n 视为换行符,解析为 \n;单独的 \r/\n 视为普通字符
把代码中的 \n 替换为 \r\n
  • closefd:当调用文件对象的 close() 方法(或 with 语句自动关闭文件)时,是否同时关闭底层的文件描述符(file descriptor),在操作系统中,所有打开的文件都会被分配一个整数型的文件描述符(比如 0 代表标准输入、1 代表标准输出、2 代表标准错误)。Python 的 open() 函数本质是封装了操作系统的系统调用,打开文件时会先向系统申请一个 fd,读写操作都是通过这个 fd 完成的,closefd 决定了 “关闭文件对象” 时,是否顺带把这个底层的 fd 也关掉;
closefd 取值
核心行为
适用场景
True
(默认)
关闭文件对象时,同时关闭底层的文件描述符;fd 被关闭后,无法再通过该 fd 操作文件
99% 的常规文件操作场景(推荐默认值)
False
关闭文件对象时,仅关闭 Python 层面的文件对象,底层的 fd 保持打开状态;仍可通过该 fd 重新打开文件,或传递给其他程序 / 函数使用
高级场景:如需要复用 fd、传递 fd 给子进程、操作管道 / 套接字等
  • opener:默认情况下,open() 函数会调用操作系统的底层 open() 系统调用(封装在 os.open() 中)来获取文件描述符(fd)。而 opener 参数允许你传入一个自定义函数,由这个函数来完成 “获取文件描述符” 的工作,替代默认的 os.open() 逻辑。

最新文章

随机文章