繁体   English   中英

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

[英]How do I read an Excel file into Python using xlrd? Can it read newer Office formats?

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

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

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

  3. pyExcelerator是abandonware-xlrd,xlwt还活着。 查看http://groups.google.com/group/python-excel

HTH约翰

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

有关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),所以要做一些反复试验。 我认为日期时间存储为花车(天数和一天中的几分之一)。

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

这里有一些我做的代码:(向下看): 这里

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM