V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pharaoh21c
V2EX  ›  Python

xlrd 如何按 excel 列名称读取特定列及单元格?

  •  
  •   pharaoh21c · 2018-07-05 23:02:07 +08:00 · 8769 次点击
    这是一个创建于 2318 天前的主题,其中的信息可能已经有所发展或是发生改变。
    版本是 3.6,请教各位高手,我有一个 excel 表格,里面列是有名称的,例如 A 列被命名为'NTCC1'。使用 xlrd 中的 sheet.col_values(0)、sheet.cell(0,0).value 命令能够按列序号及单元格地址返回值,但是我想按列名称来检索到该列及该单元格,请问代码应该怎么写?

    如果 xlrd 不能实现,其它 package 能实现吗?如 openpyxl ?非常感谢!
    17 条回复    2018-07-29 02:26:50 +08:00
    smallzhan
        1
    smallzhan  
       2018-07-05 23:54:40 +08:00
    看看 pandas 的 read_xlsx 函数
    smallzhan
        2
    smallzhan  
       2018-07-05 23:55:18 +08:00   ❤️ 1
    额,说错,是 read_excel 函数
    changnet
        3
    changnet  
       2018-07-06 01:24:19 +08:00 via Android
    好像不行。openpyxl 只是改进对高版本 excel 的支持,功能接口差不多。

    如果文档没法固定列这一列,或者这一列的范围,excel 本身就没有多少列,循环查找不就可以了么。

    我用得也不多,仅个人意见。
    LuckCode
        4
    LuckCode  
       2018-07-06 09:23:03 +08:00 via iPhone
    读出 header,获取指定列名的 index,然后按下标读?
    pharaoh21c
        5
    pharaoh21c  
    OP
       2018-07-06 10:11:34 +08:00
    @LuckCode 谢谢哈!弱弱的问一下,怎么读出 header 呀?我网上搜了半天,没看到代码。。。
    pharaoh21c
        6
    pharaoh21c  
    OP
       2018-07-06 10:12:16 +08:00
    感谢哈! @smallzhan @changnet 我再试试~~~
    shuax
        7
    shuax  
       2018-07-06 10:52:07 +08:00
    列名怎么改?
    pharaoh21c
        8
    pharaoh21c  
    OP
       2018-07-06 11:17:50 +08:00
    @shuax 我是原来表格里就有列名。。。所以想直接读取
    wangdaqiao
        9
    wangdaqiao  
       2018-07-06 13:54:40 +08:00
    先读出列名所在行(一般是第一行)到一个 list 中,然后就能根据列名找到其在哪一列,后面就很清楚了。
    saulshao
        10
    saulshao  
       2018-07-06 14:18:39 +08:00
    直接就把所有的列名都读出来,然后循环一下就知道你想要的列是在第几列了。
    smallzhan
        11
    smallzhan  
       2018-07-06 20:33:16 +08:00
    @pharaoh21c pandas 库啊,没去试一下么,read_excel 读进去数据后,表格里面的第一行,也就是你的标题,自动变成了下,例如简单的 data = pandas.read_excel("xxx.xlsx") 那么可以用 data['NTCC1'] 直接访问这一列。
    pharaoh21c
        12
    pharaoh21c  
    OP
       2018-07-06 21:53:49 +08:00
    @smallzhan @saulshao @wangdaqiao 谢谢!其实我说的列明并非第一行的列标题,而是直接将列(如 A 列)改成了另外一个名字如‘ NTCC1 ’(就是你选中了整列以后在左上角有个空格里直接输入‘ NTCC1 ’),A1 单元格是列的中文名称。现在是想读到这个‘ NTCC1 ’列名称,并非在 A1 单元格里的这个列名称。当初用 VBA 写函数的时候这样做比较方便,现在改成 python 了就不知道怎么弄了。现在我改用 openpyxl 了,pandas 等要过会儿再学习了。。。
    LuckCode
        13
    LuckCode  
       2018-07-06 23:24:07 +08:00
    @pharaoh21c 我和 #9 的想法是一样的,从回复看来是我想错了。。。
    pharaoh21c
        14
    pharaoh21c  
    OP
       2018-07-07 00:02:37 +08:00
    @LuckCode 嗯,内嵌的 VBA 还是有它的优势的,研究中。。。
    Arnie97
        15
    Arnie97  
       2018-07-08 11:41:22 +08:00 via Android
    原来这个列名本身还能改啊,囧😳
    pharaoh21c
        16
    pharaoh21c  
    OP
       2018-07-08 20:12:28 +08:00
    @Arnie97 是的,改了列名本身的话,使用 VBA 可以直接读取,而不需要再通过循环查找首行列名称来找了,我感觉应该可以节约程序运算时间。。。
    matrix273
        17
    matrix273  
       2018-07-29 02:26:50 +08:00 via Android
    list.index('NTCC1')了解一下,将对应行转换为列表,然后再 sheet.col_values(list.index('NTCC1'))
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.