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

使用pandas.read_excel的usecols参数时因Unicode列名报错

解决pandas.read_excel带Unicode列名时usecols匹配失败的问题

嘿,这个问题我太熟了!在Python 2.7环境下,这本质是字节串(str)和Unicode字符串(unicode)不匹配导致的坑,我来给你拆解清楚:

问题根源

你看,当你不指定usecols时,pandas读出来的列名是Unicode对象(从Index([u'col1', u'col2', ...])里的u前缀就能看出来);但你定义的COLUMNS是普通的字节串(Python2里不带u的字符串默认是str类型,存的是UTF-8字节)。两者类型不匹配,自然匹配不上,报错里的\xc3\xa0就是字符à的UTF-8字节形式,刚好印证了这一点。

另外你试的encoding='utf-8'参数没用,是因为这个参数只针对纯文本格式(比如csv),Excel是二进制格式,这个参数对它完全不起作用。

解决方案

这里有几个靠谱的解决办法,按优先级排序:

1. 直接用Unicode字符串定义COLUMNS

最直接的方式,给每个列名加上u前缀,让它变成Unicode类型,和pandas读出来的列名类型一致:

import pandas as pd
COLUMNS = [u'col1', u'col2', u'col with unicode à']
df = pd.read_excel(file, usecols=COLUMNS)

这个方法应该能直接解决问题,也是最推荐的。

2. 将现有字符串解码为Unicode

如果你的列名是从其他地方(比如配置文件、数据库)获取的字节串,可以用decode('utf-8')把它转成Unicode:

# 假设original_cols是字节串列表
original_cols = ['col1', 'col2', 'col with unicode à']
COLUMNS = [col.decode('utf-8') for col in original_cols]
df = pd.read_excel(file, usecols=COLUMNS)

3. 先读全量再筛选列(简单粗暴版)

如果不想纠结编码问题,也可以先读取整个Excel文件,再筛选需要的列——虽然大文件会有点费内存,但胜在简单:

df = pd.read_excel(file)
# 注意这里同样要保证COLUMNS是Unicode,或者直接引用df.columns里的原对象
df = df[[u'col1', u'col2', u'col with unicode à']]

内容的提问来源于stack exchange,提问作者Giacomo Sachs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:38:27