You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:35:19