如何使用xlrd读取Excel文件到Python?它能读取新Office格式吗?
我遇到的问题如下,但我很想听听有经验的朋友对xlrd的看法。
我刚发现xlrd,它看起来是个完美的解决方案,但我在开始时遇到了一些小问题。我想从我从道琼斯获取的Excel文件中提取数据,这个文件包含了道琼斯工业平均指数的当前成分股(链接:http://www.djindexes.com/mdsidx/?event=showAverages)。
当我直接打开这个文件时,出现了一个讨厌的BIFF错误(二进制格式无法识别)。
不过,你可以在这个截图中看到,Mac上的Excel 2008认为它是“Excel 1997-2004”格式(截图:http://skitch.com/alok/ssa3/componentreport-dji.xls-properties)。
如果我手动在Excel中打开它,并明确保存为“Excel 1997-2004”格式,然后再用xlrd在Python中打开,一切都很好。记住,Office认为这个文件已经是“Excel 1997-2004”格式了。所有文件都是.xls格式。
这里有一个pastebin的ipython会话,复现了这个问题:http://pastie.textmate.org/private/jbawdtrvlrruh88mzueqdq
你有什么想法吗: 如何让xlrd识别这个文件,以便我可以提取数据? 如何用Python自动化“另存为”格式,以便xlrd能接受? 备用方案是什么?
5 个回答
关于pyExcelerator的更多信息:要读取一个文件,可以这样做:
import pyExcelerator
book = pyExcelerator.parse_xls(filename)
这里的filename是一个字符串,表示你要读取的文件名(不是一个文件对象)。这样做会给你一个表示工作簿的数据结构:一个包含多个对的列表,每对的第一个元素是工作表的名称,第二个元素是工作表的数据。
工作表的数据是一个字典,字典的键是(行,列)对(从0开始),值是单元格的内容——通常是整数、浮点数或字符串。所以,比如说,如果所有数据都在第一个工作表上:
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为了兼容Lotus,把1900当作闰年处理,而且我不记得1900年1月1日是0还是1),所以你可以试着检查一下。日期时间是以浮点数存储的,我想(表示天数和天数的小数部分)。
我觉得对公式有部分支持,但我不能保证任何事情。
xlrd这个工具目前正在进行对2007/2008年Office格式(也叫OpenXML格式)的测试,测试阶段还很初步,属于“alpha测试”。如果你想了解更多,可以看看下面这个在python-excel讨论组里的帖子:
http://groups.google.com/group/python-excel/msg/0c5f15ad122bf24b?hl=en顺便说一下,我是xlrd的作者,也是xlwt的维护者(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能读取的文件,而且读取得更好——日期不会变成浮点数,关于Excel日期的详细信息可以在xlrd的文档中找到。
pyExcelerator已经不再维护了——而xlrd和xlwt仍然在继续更新。你可以查看这个链接:http://groups.google.com/group/python-excel
希望这些对你有帮助!
约翰