如何避免pandas to_excel将_x10e6_转换为ღ?追加Excel文件场景
解决openpyxl追加Excel时列名中_x10e6_被转为特殊字符的问题
这个问题的核心是openpyxl会自动解析_xXXXX_格式的字符串为对应Unicode实体(_x10e6_对应U+10E6字符ღ),和文件编码无关,所以调整encoding参数无效。以下是可行的解决方法:
步骤1:临时替换列名,避免自动解析
在将Pandas DataFrame写入Excel前,把列名中的_x10e6_替换为一个不会被识别为实体编码的临时标记:
goldDF = spark.read.format('csv')\ .option('header', True)\ .option('delimiter', ',')\ .load(file_path) pandaDF = goldDF.toPandas() # 替换列名中的_x10e6_为临时标记 pandaDF.columns = [col.replace('_x10e6_', 'TEMP_X10E6_PLACEHOLDER') for col in pandaDF.columns] with pd.ExcelWriter('/tmp/output.xlsx', mode='a', engine='openpyxl') as writer: pandaDF.to_excel(writer, sheet_name=name, index=False)
步骤2:修改Excel表头,恢复原列名
写入完成后,用openpyxl直接加载文件,将表头中的临时标记替换回_x10e6_:
from openpyxl import load_workbook # 加载已写入的Excel文件 wb = load_workbook('/tmp/output.xlsx') ws = wb[name] # 遍历表头行(第一行)替换标记 for cell in ws[1]: if cell.value: cell.value = cell.value.replace('TEMP_X10E6_PLACEHOLDER', '_x10e6_') # 保存修改 wb.save('/tmp/output.xlsx') # 复制到Delta Lake路径 dbutils.fs.cp("file:/tmp/output.xlsx", "/mnt/delta_lake_path")
原理说明
openpyxl遵循Office Open XML规范,会自动将_x[0-9A-F]{4}_格式的字符串解码为对应的Unicode字符。通过临时替换的方式,避开这一自动解析逻辑,写入后再恢复原列名,就能保留_x10e6_的原始文本。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

