pd.read_excel读取含西语特殊字符Excel的编码问题求助
使用pandas读取多工作表Excel文件并拆分保存为CSV时,西班牙语特殊字符(á、é、í、ó、ú、ñ)出现乱码。具体表现为原内容中的Carreño保存后变为Carreño,García变为GarcÃa。
此前处理CSV文件时,通过指定encoding='latin-1'解决过类似乱码问题,但将同样逻辑应用到Excel读取时报错。
相关代码示例(仅路径和工作表名不同):
import os import pandas as pd # 拼接Excel文件路径 path_final = os.path.join(path, excel) # 读取指定工作表 df_employees = pd.read_excel(path_final, sheetname='General (employees&interns)', encoding='UTF-8') # 定义保存路径(注:原代码路径字符串存在语法错误,已修正为合理形式) employees_path = f'General/03 HR Analytics/01. Dashboard/{year}/{month}/Processed/Employees/' # 保存为CSV df_employees.to_csv( employees_path + f"HR_Data_Template_Data_{business_list[position]}_Employees.csv", sep=';', encoding='UTF-8' )
乱码前后对比:
处理前(原Excel内容):
Carreño Julian
Natalia García
Gutiérrez Gutiérrez Pedro
处理后(保存的CSV内容):
Carreño Julian
Natlaia GarcÃa
Gutiérrez Gutiérrez Pedro
1. 为什么pd.read_excel指定encoding='UTF-8'无效?
现代Excel文件(.xlsx格式)基于Open XML标准,内部默认使用UTF-8存储字符,pd.read_excel的encoding参数对.xlsx文件完全无效——这个参数仅针对旧版二进制格式的.xls文件或特定读取引擎生效。你设置的encoding='UTF-8'属于多余操作,甚至可能引发不必要的错误。
另外,原代码中的sheetname参数已被pandas弃用,建议替换为sheet_name。
2. 乱码的真正根源:CSV保存环节
你看到的乱码并非读取Excel时产生,而是保存CSV时的编码与后续打开工具的编码不匹配导致的:
- Windows系统下的Excel默认用
cp1252(Latin-1的超集)编码解析CSV文件; - 若你用
encoding='UTF-8'保存CSV且不带BOM(字节顺序标记),Excel无法自动识别UTF-8编码,就会把UTF-8的多字节字符解析为单字节,出现类似ñ的乱码。
3. 具体解决方法
方法一:保存带BOM的UTF-8 CSV
使用utf-8-sig编码保存,它会在文件开头添加BOM,让Excel自动识别UTF-8编码:
# 读取Excel时去掉无效的encoding参数,修正sheet_name df_employees = pd.read_excel(path_final, sheet_name='General (employees&interns)') # 保存时用utf-8-sig编码 df_employees.to_csv( employees_path + f"HR_Data_Template_Data_{business_list[position]}_Employees.csv", sep=';', encoding='utf-8-sig', index=False # 建议添加,避免保存不必要的索引列 )
方法二:用Latin-1编码保存CSV
如果你的数据仅包含西班牙语字符(Latin-1编码覆盖所有西班牙语特殊字符),可以直接用encoding='latin-1'保存,确保Excel能正确解析:
df_employees.to_csv(..., encoding='latin-1')
方法三:检查Excel文件本身的编码(针对旧版.xls)
如果你的文件是旧版.xls格式,而非.xlsx,可以尝试指定encoding='latin-1'并使用xlrd引擎读取:
df_employees = pd.read_excel( path_final, sheet_name='General (employees&interns)', encoding='latin-1', engine='xlrd' )
注意:xlrd 2.0+版本不再支持.xlsx文件,若需读取.xlsx需使用openpyxl引擎。
内容的提问来源于stack exchange,提问作者alfonsosmdc

