如何使用xlrd将Excel文件读入Python?它能够读取更新的Office格式吗?

11

我遇到的问题如下,但希望有经验的xlrd用户给予意见。

我刚刚接触到xlrd,它似乎是完美的解决方案,但我在入手上遇到了一些小问题。我试图通过程序从Dow Jones下载的包含道琼斯工业平均指数(链接:http://www.djindexes.com/mdsidx/?event=showAverages)的Excel文件中提取数据。

当我打开未修改的文件时,出现了一个严重的BIFF错误(无法识别二进制格式)。

但是您可以在此屏幕截图中看到,Mac版Excel 2008认为它处于“Excel 1997-2004”格式中(截图:http://skitch.com/alok/ssa3/componentreport-dji.xls-properties)。

如果我手动以“Excel 1997-2004”格式打开它,然后使用xlrd在Python中打开,一切都很好。请记住,Office认为该文件已经处于“Excel 1997-2004”格式中。所有文件都是.xls

这里是复制问题的ipython会话的pastebin: http://pastie.textmate.org/private/jbawdtrvlrruh88mzueqdq

对于以下问题,有什么想法: 如何欺骗xlrd以识别文件,以便我可以提取数据? 如何使用Python自动将文件保存为xlrd可接受的“保存为”格式? 备选方案?

5个回答

26

FWIW,我是xlrd的作者,也是xlwt(pyExcelerator的分支)的维护者。以下几点需要指出:

  1. The file ComponentReport-DJI.xls is misnamed; it is not an XLS file, it is a tab-separated-values file. Open it with a text editor (e.g. Notepad) and you'll see what I mean. You can also look at the not-very-raw raw bytes with Python:

    >>> open('ComponentReport-DJI.xls', 'rb').read(200)
    'COMPANY NAME\tPRIMARY EXCHANGE\tTICKER\tSTYLE\tICB SUBSECTOR\tMARKET CAP RANGE\
    tWEIGHT PCT\tUSD CLOSE\t\r\n3M Co.\tNew York SE\tMMM\tN/A\tDiversified Industria
    ls\tBroad\t5.15676229508\t50.33\t\r\nAlcoa Inc.\tNew York SE\tA'
    

    You can read this file using Python's csv module ... just use delimiter="\t" in your call to csv.reader().

  2. xlrd can read any file that pyExcelerator can, and read them better—dates don't come out as floats, and the full story on Excel dates is in the xlrd documentation.

  3. pyExcelerator is abandonware—xlrd and xlwt are alive and well. Check out http://groups.google.com/group/python-excel

HTH John


3

1
John Machin已经公开发布了这个消息(通过邮件列表),并且表达了具体计划,将在年底左右将其整合到新的完整版本的xlrd中。 - John Y
这是几天前发布的v0.8版本:https://groups.google.com/forum/?fromgroups#!topic/python-excel/w2AoQkX3TZc[1-25] - RuiDC

1

关于pyExcelerator的更多信息:要读取文件,请执行以下操作:

import pyExcelerator
book = pyExcelerator.parse_xls(filename)

其中filename是一个字符串,表示要读取的文件名(不是类似文件的对象)。这将为您提供代表工作簿的数据结构:一对列表,其中对的第一个元素是工作表名称,第二个元素是工作表数据。

工作表数据是一个字典,其中键是(行、列)对(从0开始),值是单元格内容--通常是int、float或字符串。因此,在所有数据都在第一个工作表的简单情况下:

data = book[0][1]
print 'Cell A1 of worksheet %s is: %s' % (book[0][0], repr(data[(0, 0)]))

如果单元格为空,你会得到一个 KeyError。如果你处理日期,它们可能会以整数或浮点数的形式出现;如果是这种情况,你需要进行转换。基本规则是:datetime.datetime(1899, 12, 31) + datetime.timedelta(days=n),但这可能会有1或2天的偏差(因为Excel将1900年视为闰年以与Lotus兼容,而且我不记得1900-1-1是0还是1),所以要进行一些试错来检查。我认为日期时间存储为浮点数(天数和一天的分数)。
我认为公式有部分支持,但我不能保证任何事情。

3
pyExcelerator存在一些已知的缺陷 - 'xlrd'分支兼容并且得到维护。 - mikemaccana

0

这里是我编写的一些代码(请往下看):here

对于新格式我不是很确定——如果xlrd不能读取它,那么xlrd需要发布一个新版本!


-1

你必须使用xlrd吗?我刚从那个网站下载了“更新 - 道琼斯工业平均指数移动者 - 2008”,使用pyExcelerator读取没有任何问题。

import pyExcelerator
book = pyExcelerator.parse_xls('DJIAMovers.xls')

似乎没有太多关于pyExcelerator的文档可用。你能否向我展示打开文件和提取数据的基础知识? - lowkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接