Python读写CSV文件指定utf-8编码时重音字符ì乱码问题求助
问题原因分析
你遇到的乱码是典型的UTF-8编码内容被错误用Latin-1(ISO-8859-1)单字节编码解析导致的:字符ì的UTF-8编码为两个字节0xC3 0xAC,如果用Latin-1解码这两个字节,就会分别得到Ã和¬,也就是你看到的ì。
内存中字符显示正常,说明读取阶段的编码配置没问题,问题出在写入环节或者输出文件的解析环节,常见错误场景如下:
- 写入时
encoding='utf-8'参数配置错误,比如把参数写在了csv.writer的入参里,而没有写在open()函数的入参中,导致写入编码实际没有生效 - 写入前对字符串做了多余的编码转换,比如手动将字符串用UTF-8编码为bytes后又当成字符串写入,造成二次编码
- 输出文件本身编码正确,但你用来打开文件的工具(最常见为Windows系统下的Excel)默认用非UTF-8编码解析文件,造成显示乱码
解决方法
1. 修正写入代码的编码配置
使用Python标准csv模块写入的正确示例如下,确保encoding参数配置在open()函数中:
import csv with open('output.csv', 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f) output_line = [name, address, citizenship_flag] writer.writerow(output_line)
如果需要在Windows系统下用Excel直接打开输出文件,可将编码改为utf-8-sig,写入时会自动添加UTF-8 BOM头,帮助Excel识别编码:
with open('output.csv', 'w', encoding='utf-8-sig', newline='') as f:
2. 校验文件实际编码是否正确
不要直接用Excel打开验证编码,用如下代码读取文件校验:
with open('output.csv', 'r', encoding='utf-8') as f: content = f.read() print('sì' in content)
如果返回True说明文件本身编码正常,乱码是打开工具的解析问题。
3. 修正文件打开工具的解码配置
如果确认文件本身编码正确,打开文件时手动指定工具的解码编码为UTF-8即可。比如Excel中可以通过「数据」-「自文本/CSV」路径导入文件,导入时选择编码为UTF-8。
内容的提问来源于stack exchange,提问作者Stef
相关产品推荐
相关产品推荐

