Python用Pandas导出含阿拉伯字符的CSV乱码,如何正确配置UTF-8编码
含阿拉伯字符CSV导出乱码问题定位与修复方案
常见代码错误定位
- 导出方法未显式指定编码参数:pandas在Windows环境下调用
df.to_csv()时,默认使用系统本地编码(多为GBK/ANSI)写入文件,这类编码无法完整承载阿拉伯字符的字节,会直接生成乱码文件 - 读取源文件阶段编码不匹配:如果源CSV是UTF-8编码,读取时未指定对应编码,pandas会用默认编码错误解码阿拉伯字符,内存中的数据从读取环节就已经损坏,后续导出操作无论怎么设置都无法得到正确内容
- 指定UTF-8编码时遗漏BOM标记:纯无BOM的UTF-8文件,在Windows系统下用Excel打开时会因为缺少编码识别标记,错误按ANSI编码解析内容,哪怕文件字节本身正确,打开后依然显示乱码,对阿拉伯这类非ASCII字符的影响尤为明显
正确的编解码配置实现
读写环节统一按规则设置编码,即可彻底解决乱码问题:
- 读取阶段配置
- 读取CSV文件时,使用
encoding='utf-8-sig'参数,可自动兼容带/不带BOM的UTF-8源文件,不会把文件开头的BOM字符读入数据列:pd.read_csv(源文件路径, encoding='utf-8-sig') - 读取Excel文件时无需额外设置编码参数,pandas会自动解析xlsx/xls格式的内部编码规则,只要源文件无损坏就不会出现解码错误
- 读取CSV文件时,使用
- 导出阶段配置
编写download_file的导出逻辑时,替换原有to_csv的默认配置:
配置说明:def download_file(df, output_path): # 保留原有文件复制、数据类型转换的业务逻辑 df.to_csv( output_path, index=False, encoding='utf-8-sig', line_terminator='\n' )encoding='utf-8-sig'会在写入文件时自动添加UTF-8 BOM头,Windows、macOS本地Excel可直接识别编码,阿拉伯、中文等非拉丁字符不会出现显示异常- 如果导出的文件要对接Linux端的下游程序处理,可将encoding换回
'utf-8',避免BOM头给下游解析带来兼容问题
快速排查校验步骤
- 逐行检查原有
download_file函数的to_csv调用,确认是否遗漏了encoding参数,未显式设置参数的情况下,Windows环境下生成的CSV必然无法正常存储阿拉伯字符 - 检查源文件读取环节的代码,确认读取UTF-8编码CSV时是否指定了对应编码,避免从读取阶段就把源数据解码成乱码
- 修复后可通过Notepad++打开生成的CSV,确认右下角显示的编码为
UTF-8-BOM,且阿拉伯字符可正常显示,再验证Excel打开的效果
内容的提问来源于stack exchange,提问作者DevLeb2022
相关产品推荐
相关产品推荐

