Python中如何解决常见的编码问题?
import csv
with open(“demo.csv”,“w”,encoding= “utf-8”) as f:
w = csv.writer(f)
w.writerow(u’\u22ef’)
结果写进 csv 的是乱码,采用 gb18030 编码写进 csv 的是"??",如果不添加 encoding 就会报 gbk 错误
如果单纯只是print(u'\u22ef'),结果是“……”,请问如何才能将省略号写入 csv。
谢谢!
Python中如何解决常见的编码问题?
代码里面 encoding 不是 utf-8 么?和 gb18030 的关系是?
你用个能用 UTF-8 编码打开文件的文本编辑器应该就正常了。
处理Python编码问题,核心是理解“编码/解码”过程。常见问题及解决方案如下:
1. 文件读写编码问题
# 明确指定编码(推荐utf-8)
with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()
with open('file.txt', 'w', encoding='utf-8') as f:
f.write('内容')
2. 字符串与字节转换
# 字符串转字节(编码)
text = "你好"
bytes_data = text.encode('utf-8') # b'\xe4\xbd\xa0\xe5\xa5\xbd'
# 字节转字符串(解码)
original_text = bytes_data.decode('utf-8') # "你好"
3. 处理不同编码的数据
def convert_encoding(data, from_enc, to_enc='utf-8'):
"""转换编码"""
if isinstance(data, str):
# 如果是字符串,先编码再解码
return data.encode(from_enc).decode(to_enc)
elif isinstance(data, bytes):
# 如果是字节,直接解码再编码
return data.decode(from_enc).encode(to_enc)
return data
# 示例:gbk转utf-8
gbk_text = "测试".encode('gbk')
utf8_text = convert_encoding(gbk_text, 'gbk', 'utf-8')
4. 处理含BOM的文件
import codecs
# 读取带BOM的UTF-8文件
with codecs.open('file.txt', 'r', 'utf-8-sig') as f:
content = f.read() # 自动去除BOM
# 写入带BOM的文件
with codecs.open('file.txt', 'w', 'utf-8-sig') as f:
f.write('内容')
5. 处理网络请求编码
import requests
resp = requests.get('http://example.com')
# 自动检测编码
resp.encoding = resp.apparent_encoding
text = resp.text
6. 数据库编码处理
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='',
database='test',
charset='utf8mb4' # 支持4字节UTF-8
)
通用建议:
- 项目内部统一使用UTF-8编码
- 所有I/O操作明确指定编码
- 使用
sys.getdefaultencoding()检查默认编码 - 对不确定编码的数据,先尝试常见编码(utf-8, gbk, latin-1)
一句话总结:统一用UTF-8,读写都显式指定编码。
换 Python3 试试?
UTF-8 编码的 csv 文件需要加 BOM 头,Excel 才能正确识别:
import csv
import codecs
with open(“demo.csv”,“wb”) as f:
-> f.write(codecs.BOM_UTF8)
with open(“demo.csv”,“a”,encoding=“utf-8”) as f:
-> w = csv.writer(f)
-> w.writerow(u’\u22ef’)
如果乱码是指用 excel 打开看到话应该是楼上说的原因.
或者用 excel 的导入功能, 可以正常打开 utf8 格式的 csv
一直使用的都是 py3,对于 py2 了解有限,不过你楼下已经给出了解答,还是谢谢
感谢,已测可行

