本文目录导读:

在Python中设置文件编码有以下几种常见方法:
源文件编码声明(Python 2兼容)
在Python文件的第一行或第二行添加编码声明:
# -*- coding: utf-8 -*- # 或者 # coding: utf-8
完整示例:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 包含中文的代码
print("你好,世界!")
文件读写时指定编码
写入文件:
# 写入UTF-8编码文件
with open('example.txt', 'w', encoding='utf-8') as f:
f.write("中文内容测试")
# 写入GBK编码文件
with open('example_gbk.txt', 'w', encoding='gbk') as f:
f.write("中文内容测试")
读取文件:
# 读取UTF-8编码文件
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 读取GBK编码文件
with open('example_gbk.txt', 'r', encoding='gbk') as f:
content = f.read()
print(content)
解决编码错误问题
处理UnicodeDecodeError:
# 使用errors参数处理编码错误
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
# 或者使用replace替换无法解码的字符
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:
content = f.read()
自动检测编码:
import chardet
# 检测文件编码
with open('unknown_file.txt', 'rb') as f:
raw_data = f.read()
result = chardet.detect(raw_data)
encoding = result['encoding']
print(f"检测到的编码: {encoding}")
# 使用检测到的编码读取文件
with open('unknown_file.txt', 'r', encoding=encoding) as f:
content = f.read()
Python 2 vs Python 3 差异
Python 2(不推荐):
# -*- coding: utf-8 -*- # Python 2中字符串默认是ASCII s = "中文" # 需要声明编码 u = u"中文" # Unicode字符串
Python 3(推荐):
# Python 3中字符串默认是Unicode s = "中文" # 直接使用,不需要编码声明
实用示例:处理CSV文件编码
import csv
# 写入CSV(UTF-8 with BOM用于Excel兼容)
with open('data.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['姓名', '年龄', '城市'])
writer.writerow(['张三', 25, '北京'])
# 读取CSV
with open('data.csv', 'r', encoding='utf-8-sig') as f:
reader = csv.reader(f)
for row in reader:
print(row)
全局设置编码
import sys import io # 设置标准输出编码 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') # 在Python启动时设置(不推荐生产环境使用) import locale locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
常见编码问题解决:
- 乱码问题:确保读取和写入使用相同的编码
- UnicodeEncodeError:检查输出设备的编码支持
- BOM头问题:使用
utf-8-sig代替utf-8处理带BOM的文件
最佳实践建议:
- 统一使用UTF-8编码
- 在Python 3中始终指定
encoding参数 - 使用
errors参数处理异常情况