如何将DataFrame保存为CSV文件存入FileField并解决乱码问题
问题原因
- 未显式指定
df.to_csv()的编码规则,pandas会自动继承运行环境的默认编码,不同操作系统的默认编码不一致,就会导致生成的CSV文件出现非预期的乱码字符。 - 你直接将
to_csv()返回的字符串传入ContentFile,ContentFile会自动使用Django配置项DEFAULT_CHARSET(默认值为utf-8)对字符串做转码存储,如果转码规则和CSV本身的编码不匹配,也会触发乱码问题。 - 如果生成的CSV文件需要在Windows系统用Excel打开,未加BOM头的UTF-8编码文件会被Excel默认用GBK解析,也会表现为乱码。
修复方案
两种写法都可以:
写法1:直接指定编码后传入ContentFile
# 指定encoding为utf-8-sig,自带BOM头兼容多平台打开 new_df = df.to_csv(columns=['A', 'B'], index=False, encoding='utf-8-sig') doc.csvfile.save(f'{doc.id}.csv', ContentFile(new_df))
写法2:用字节流存储更稳定,避免隐式转码
from io import BytesIO buffer = BytesIO() df.to_csv(buffer, columns=['A', 'B'], index=False, encoding='utf-8-sig') # 移动文件指针到开头 buffer.seek(0) doc.csvfile.save(f'{doc.id}.csv', buffer)
如果不需要兼容Excel打开,把上面的utf-8-sig换成utf-8即可。
内容的提问来源于stack exchange,提问作者mathque33
相关产品推荐
相关产品推荐

