Python中如何将DataFrame转为UTF-8编码 解决charmap编码报错问题
非UTF-8字符DataFrame编码报错处理方案
你遇到的charmap编码报错是因为写入日志时系统默认编码(通常是Windows下的GBK)无法匹配PDF导入的特殊Unicode字符,可通过以下两种方案解决:
方案1:不修改数据,调整写入编码(优先推荐)
不需要对DataFrame本身做任何处理,仅在打开日志文件时指定utf-8编码即可兼容所有Unicode字符,不会丢失原始数据:
# 写入时指定编码,适配所有特殊字符 with open("运行日志.log", "w", encoding="utf-8") as log_file: log_file.write(df.to_string())
如果是用pandas自带的to_csv等方法写文件,也可以直接指定编码参数:
df.to_csv("导出结果.csv", encoding="utf-8", index=False)
方案2:批量清洗DataFrame所有字符
如果后续处理必须要求ASCII编码,可以对整个DataFrame的所有单元格批量执行归一化转码操作:
import unicodedata import pandas as pd def clean_cell_value(val): # 跳过非字符串类型的单元格(数值、日期等不需要处理) if not isinstance(val, str): return val # 执行NFD归一化后转ASCII,忽略无法编码的字符,再转回字符串格式 normalized = unicodedata.normalize("NFD", val) return normalized.encode("ascii", "ignore").decode("ascii") # 全表逐元素应用清洗规则 # pandas 2.0及之前版本用applymap df_cleaned = df.applymap(clean_cell_value) # pandas 2.1及之后版本用map替换已弃用的applymap # df_cleaned = df.map(clean_cell_value)
两种方案适用场景
- 方案1适配性更强,不会丢失原始信息,无特殊要求优先使用
- 方案2适合必须使用ASCII编码的下游场景,会丢弃无法转码的特殊字符
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

