使用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
相关产品推荐
相关产品推荐

