如何使用xlrd将Excel文件读入Python?它可以读取较新的Office格式吗?
我的问题在下面,但有xlrd经验的人都会有兴趣发表评论。
我刚刚找到了xlrd,它看起来是完美的解决方案,但入门时遇到了一些小问题。我正在尝试以编程方式从使用道琼斯工业平均指数的当前成分从道琼斯提取的Excel文件中提取数据(链接:http://www.djindexes.com/mdsidx/?event=showAverages)
当我打开未修改的文件时,出现讨厌的BIFF错误(无法识别二进制格式)
但是,我们可以在此屏幕快照中看到Excel 2008 for Mac认为它是" Excel 1997-2004"格式的(屏幕截图:http://skitch.com/alok/ssa3/componentreport-dji.xls-properties)
如果我改为手动在Excel中打开它并显式另存为'Excel 1997-2004'格式,然后以python usig xlrd打开,一切都会很棒。请记住,Office认为该文件已经是" Excel 1997-2004"格式。所有文件均为.xls
这是复制该问题的ipython会话的pastebin:http://pastie.textmate.org/private/jbawdtrvlrruh88mzueqdq
关于以下方面的任何想法:
如何欺骗xlrd识别文件以便提取数据?
如何使用python自动将显式的"另存为"格式自动转换为xlrd将接受的格式?
计划B?
解决方案
好吧,这是我做的一些代码:(向下看):这里
如果xlrd无法读取,则不确定较新的格式,xlrd需要发布新版本!
我们必须使用xlrd吗?我刚刚从该网站下载了"更新的道琼斯工业平均指数2008",并且可以轻松地使用pyExcelerator进行阅读。
import pyExcelerator book = pyExcelerator.parse_xls('DJIAMovers.xls')
有关pyExcelerator的更多信息:要读取文件,请执行以下操作:
import pyExcelerator book = pyExcelerator.parse_xls(filename)
其中filename是一个字符串,它是要读取的文件名(不是类似文件的对象)。这将为我们提供代表工作簿的数据结构:成对列表,其中成对的第一个元素是工作表名称,第二个元素是工作表数据。
工作表数据是一个字典,其中的键是(行,列)对(从0开始),值是单元格内容-通常是int,float或者string。因此,例如,在所有数据都在第一个工作表上的简单情况下:
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兼容的a年,并且因为我不记得1900-1-1是0还是1),所以要进行反复试验来检查。我认为日期时间存储为浮点数(天和一天的零头)。
我认为论坛提供了部分支持,但我不能保证。
对Office 2007/2008(OpenXML)格式的xlrd支持在alpha测试中,请参见python-excel新闻组中的以下文章:
http://groups.google.com/group/python-excel/msg/0c5f15ad122bf24b?hl=zh-CN
FWIW,我是xlrd的作者,也是xlwt(pyExcelerator的一个分支)的维护者。几点:
- 文件ComponentReport-DJI.xls的名称错误;它不是XLS文件,而是制表符分隔值文件。使用文本编辑器(例如记事本)打开它,我们会明白我的意思。我们还可以使用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'
我们可以使用Python的csv模块读取此文件...只需在对csv.reader()
的调用中使用delimiter =" \ t"
。
- xlrd可以读取pyExcelerator可以读取的任何文件,并且可以以浮点数的形式读取它们,而bestdates不会以浮点数的形式出现,有关Excel日期的完整信息在xlrd文档中。
- pyExcelerator被放弃了,xlwt和xlwt都还不错。查看http://groups.google.com/group/python-excel
高温超导
约翰