簡體   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