Python中读取与写入文件时的编码方式

文章讲述了在Python中进行文件读写时,特别是涉及中文内容时,需要关注编码方式。未指定编码读取文件会导致乱码问题,而读写文件时应确保编码方式一致,如UTF-8用于英文和多字节中文,GBK则用于双字节编码。不匹配的编码会导致内容无法正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Python中文件的读取》《Python中文件的写入》中提到通过文件对象调用read()函数和write()函数实现文件的读写。以上方法能够正确地取或写入英文时,当要读写的内容是中文时,则需要考虑编码方式。

1 读取已经存在的数据

1.1 创建文件

创建一个txt文件,在该文件中输入中文内容“你好世界”,可以看到该文件的编码方式是“UTF-8”,如图1所示。

图1 新建txt文件

相关链接1 UTF-8编码,是Unicode Transformation Format即可变长字符编码的简称,使用UTF-8编码,英文字母用一个字节表示,中文汉字用三个字节表示。“你好世界”这四个中文汉字的UTF-8编码如图2所示。

图2 “你好世界”的UTF-8编码

1.2 读取文件

1.2.1 未指定编码方式

使用图3所示的代码读取文件。

 

图3 未指定编码方式读取文件的代码

此时,open()函数没有指定使用何种编码方式读取文件,因此打印出来的内容是乱码。

1.2.2 指定编码方式

open()函数的encoding参数指定了以何种编码方式读取文件,代码图4所示。

图4 指定编码方式读取文件的代码

以上代码中,使用了“UTF-8”编码方式读取文件内容,此时的输出是“你好世界”。

2 读取Python代码写入的数据

在读取Python代码写入的数据时,应使用与写入时使用的相同编码方式。例如,在写入时使用“gbk”方式,那么在读取时必须也要使用“gbk”方式,而不能使用“UTF-8”的方式。

相关链接2 GBK编码,Chinese Internal Code Specification即汉字内码扩展规范的简称,其中K是汉语“扩展”的拼音“KuoZhan的简写。无论英文字母还是中文汉字,都是用两个字节表示,如图5所示。

图5 “你好世界”的GBK编码

2.1 使用指定方式写入数据

使用“GBK”编码方式向data.txt文件中写入“你好世界”,代码如图6所示。

图6 指定编码方式向文件中写入数据的代码

打开data.txt,此时可以看到该文件的编码方式是“ANSI”,如图7所示。

图7 使用Python代码写入的txt文件

相关链接3 ANSI编码,是American National Standards Institute即美国国家学会标准的简写,在简体中文的操作系统中,ANSI编码代表的就是GBK编码。

2.2 使用相同的编码方式读取文件

读取文件的代码如图8所示。

图8 使用相同的编码方式读取文件

如果读取时使用的编码方式与写入时不同,则无法正确读取数据,如图9所示。

图9 使用不同的编码方式读取文件

### Python 读取 UTF-8 编码文件出现乱码的解决方案 当使用 Python 读取 UTF-8 编码的文件,可能会因为未指定正确的编码格式或者文件本身存在其他编码问题而引发乱码现象。以下是几种常见的解决方法: #### 方法一:显式指定 `encoding='utf-8'` 参数 在打开文件,通过设置参数 `encoding='utf-8'` 来确保按照 UTF-8 格式解码文件内容[^1]。 ```python with open('example.txt', 'r', encoding='utf-8') as f: for line in f: print(line.strip()) ``` 这种方法适用于大多数情况下处理纯文本文件的需求。 --- #### 方法二:以二进制模式读取并手动解码 如果无法直接通过 `encoding='utf-8'` 正确解析文件,则可以选择以二进制模式 (`rb`) 打开文件,并随后调用 `.decode('utf-8')` 进行解码操作。 ```python with open('example.txt', 'rb') as f: content = f.read().decode('utf-8') print(content) ``` 此方法特别适合于某些特殊场景下的数据处理需求。 --- #### 方法三:统一字符串编码为 UTF-8 后再打印 对于涉及跨平台或不同操作系统环境的情况,可能需要先将字符串从原始编码 (如 GBK) 转换为目标编码 (UTF-8),然后再执行后续逻辑运算或显示输出[^2]。 ```python s = "你好".encode('gbk') # 假设原串采用 gbk 编码形式存储 converted_s = s.decode('gbk').encode('utf-8') print(converted_s.decode('utf-8')) ``` 上述代码片段展示了如何把一个原本基于 GBK 编码表示的文字序列调整成符合 UTF-8 规范的新版本。 --- #### 方法四:批量检测修正 JSONL 文件中的编码错误 针对包含多条记录的大规模结构化数据集合(例如 JSON Lines),可以通过编写专门脚本来完成自动化的编码校正工作流程[^4]。 下面给出一段简单的实现例子用于演示目的: ```python import os import chardet def detect_encoding(filename): with open(filename, 'rb') as rawdata: result = chardet.detect(rawdata.read(1000)) return result['encoding'] def convert_file_to_utf8(input_path, output_path): detected_enc = detect_encoding(input_path) if not detected_enc or detected_enc.lower() != 'utf-8': with open(input_path, 'rb') as src_f, \ open(output_path, 'w', encoding='utf-8') as dst_f: text = src_f.read() decoded_text = text.decode(detected_enc).replace('\u0000', '') dst_f.write(decoded_text) if __name__ == "__main__": input_filepath = './input.jsonl' output_filepath = './output_converted.jsonl' try: convert_file_to_utf8(input_filepath, output_filepath) print(f'Successfully converted {input_filepath} to UTF-8.') except Exception as e: print(f'Error during conversion: {e}') ``` 该程序首先利用第三方库 `chardet` 推测目标文档的实际编码类别;接着依据判断结果决定是否有必要实施进一步的操作——即将非标准格式的数据重新编码至标准化后的状态以便长期维护管理便利性考虑。 --- ### 总结 以上介绍了四种主要应对策略来克服 Python 中由于未能妥善设定输入源字符集所造成的视觉异常状况。具体选用哪一种取决于实际应用场景以及待解决问题的具体特征等因素综合考量之后作出最佳抉择即可达成预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值