11

我的问题在下面,但是任何有 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计划?

4

5 回答 5

26

FWIW,我是 xlrd 的作者,也是 xlwt(pyExcelerator 的一个分支)的维护者。几点:

  1. 文件 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 模块读取此文件……只需delimiter="\t"在调用csv.reader().

  2. xlrd 可以读取 pyExcelerator 可以读取的任何文件,并且可以更好地读取它们 - 日期不会以浮点数形式出现,有关 Excel 日期的完整故事在 xlrd 文档中。

  3. pyExcelerator 是废弃软件——xlrd 和 xlwt 还活得好好的。查看http://groups.google.com/group/python-excel

HTH 约翰

于 2009-03-29T14:21:13.750 回答
3

xlrd 对 Office 2007/2008 (OpenXML) 格式的支持处于 alpha 测试阶段 - 请参阅 python-excel 新闻组中的以下帖子: http ://groups.google.com/group/python-excel/msg/0c5f15ad122bf24b?hl=en

于 2008-11-07T14:14:03.777 回答
1

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

import pyExcelerator
book = pyExcelerator.parse_xls(filename)

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

工作表数据是一个字典,其中键是 (row, col) 对(从 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 兼容的闰年,并且因为我不记得 1900-1-1 是 0 还是 1),所以请进行一些试验和错误检查。日期时间存储为浮点数,我认为(天和一天的一小部分)。

我认为对论坛有部分支持,但我不保证任何事情。

于 2008-09-24T02:05:29.457 回答
0

好吧,这是我做的一些代码:(往下看):这里

不确定更新的格式 - 如果 xlrd 无法读取,xlrd 需要发布新版本!

于 2008-09-23T01:14:51.067 回答
-1

你必须使用xlrd吗?我刚刚从该网站下载了“更新 - 道琼斯工业平均指数 - 2008”,并且使用pyExcelerator阅读它没有任何问题。

import pyExcelerator
book = pyExcelerator.parse_xls('DJIAMovers.xls')
于 2008-09-23T02:33:40.647 回答