Python读取文本内容方法:使用open()方法# 1. 打开文件f = open("文件路径", "r", encoding="utf-8")# 2. 读取内容content = f.read()# 3. 关闭文件(必须!否则会占用系统资源)f.close()
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- file:文件路径。例如E:\read_file\text.txt
- model:这个参数是用来指定文件的打开方式(读 / 写 / 追加、文本 / 二进制模式等;
| | |
|---|
'r' | | 1. 默认模式;2. 文件必须存在,否则报错;3. 指针在文件开头 |
'rb' | | 读取字节流(如图片 / 视频),不涉及编码,返回 bytes 类型 |
'w' | | 1. 文件不存在则创建;2. 文件存在则清空原有内容;3. 指针在文件开头 |
'wb' | | 写入字节流,用于保存图片 / 视频 / 二进制数据 |
'a' | | 1. 文件不存在则创建;2. 写入内容追加到文件末尾;3. 指针在文件末尾 |
'ab' | | |
'r+' | | 1. 文件必须存在;2. 可同时读和写;3. 指针在开头,写入会覆盖原有内容 |
'rb+' | | |
'w+' | | 1. 文件不存在则创建;2. 先清空文件;3. 可读写,指针在开头 |
'wb+' | | |
'a+' | | 1. 文件不存在则创建;2. 写入追加到末尾;3. 读取需先移动指针(seek()) |
'ab+' | | |
'x' | | 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/0,大文件用 >1 的自定义大小。
- encoding:计算机存储文件时,本质是存储二进制字节(
0/1),而我们读写的文本是字符(如中文、英文、符号)。encoding 参数就是定义:
- 读文件:把硬盘里的二进制字节,按照指定编码 “翻译” 成人类能看懂的字符串(str);
- 写文件:把字符串(str)按照指定编码 “翻译” 成二进制字节,再存入硬盘。
如果不指定 encoding,Python 会使用系统默认编码(Windows 通常是 gbk,Linux/macOS 通常是 utf-8),这是导致中文等非 ASCII 字符乱码的最常见原因。 | | |
|---|
utf-8 | 最通用的编码,兼容所有语言(中文、英文、符号等),占用空间灵活 | 绝大多数场景(推荐优先使用),如跨平台文件、网页、程序配置 |
gbk | 中文专用编码,对中文支持更好,占用空间比 utf-8 略小 | |
ascii | | 纯英文文本,不推荐用于含非 ASCII 字符的文件 |
utf-16 | | 少数系统 / 软件的专用文件(如某些 Windows 系统文件) |
- errors:当文件读写过程中遇到编码 / 解码错误时,程序该如何处理这些错误(比如忽略、替换乱码字符,或直接报错);我们知道 encoding 负责字符和字节的转换,但若文件中的二进制字节不符合指定的编码规则(比如用 utf-8 读取一个 gbk 编码的乱码字节),就会触发 UnicodeDecodeError/UnicodeEncodeError。errors 参数就是用来定义这种错误的处理策略,避免程序直接崩溃,同时灵活控制乱码的处理方式。
| | |
|---|
strict | 遇到编码 / 解码错误时,直接抛出 UnicodeError 异常,程序终止 | 严格场景(如重要数据读写),要求编码完全正确,不允许乱码 |
ignore | | 非关键文本读取(如日志文件),允许丢失少量乱码字符 |
replace | | 需保留文本结构,允许用占位符替代乱码(如展示网页文本) |
backslashreplace | 用 Python 的反斜杠转义序列(如 \x80)替代错误字符 | |
surrogateescape | 用 Unicode 代理字符替代错误字节,读取后可还原原始字节 | 处理系统文件(如 Windows 注册表)的特殊编码 |
xmlcharrefreplace | | 生成 XML/HTML 文件时,避免乱码破坏标签结构 |
namereplace | 用 \N{...} 形式的 Unicode 名称替代错误字符 | |
- newline:用来控制文件读写时换行符的处理规则—— 包括输入(读取)时如何解析换行符,以及输出(写入)时如何转换换行符,
不同操作系统的换行符标准不同:
- Windows:用
\r\n(回车 + 换行)表示换行; - Linux/macOS:用
\n(换行)表示换行; - newline参数为了统一跨平台的换行符处理逻辑,避免读取windows文本文 件时出现多余的\r,或写入文件时换行符不兼容目标系统。
| | |
|---|
None | 1. 把 \n、\r\n、\r 都解析为 \n;2. 自动忽略换行符前后的空白(跨平台兼容) | 把代码中的 \n 替换为系统默认换行符(Windows→\r\n,Linux/macOS→\n) |
'' | 1. 解析规则同 None(兼容所有换行符);2. 保留原始换行符的所有字节(不忽略空白) | 不替换 \n,直接写入代码中的换行符(\n 就是 \n) |
'\n' | 仅把 \n 视为换行符,\r 会被当作普通字符保留 | |
'\r' | | |
'\r\n' | 仅把 \r\n 视为换行符,解析为 \n;单独的 \r/\n 视为普通字符 | |
- closefd:当调用文件对象的
close() 方法(或 with 语句自动关闭文件)时,是否同时关闭底层的文件描述符(file descriptor),在操作系统中,所有打开的文件都会被分配一个整数型的文件描述符(比如 0 代表标准输入、1 代表标准输出、2 代表标准错误)。Python 的 open() 函数本质是封装了操作系统的系统调用,打开文件时会先向系统申请一个 fd,读写操作都是通过这个 fd 完成的,closefd 决定了 “关闭文件对象” 时,是否顺带把这个底层的 fd 也关掉;
| | |
|---|
True | 关闭文件对象时,同时关闭底层的文件描述符;fd 被关闭后,无法再通过该 fd 操作文件 | |
False | 关闭文件对象时,仅关闭 Python 层面的文件对象,底层的 fd 保持打开状态;仍可通过该 fd 重新打开文件,或传递给其他程序 / 函数使用 | 高级场景:如需要复用 fd、传递 fd 给子进程、操作管道 / 套接字等 |
- opener:默认情况下,
open() 函数会调用操作系统的底层 open() 系统调用(封装在 os.open() 中)来获取文件描述符(fd)。而 opener 参数允许你传入一个自定义函数,由这个函数来完成 “获取文件描述符” 的工作,替代默认的 os.open() 逻辑。