2012-01-31 50 views
0

我用xlrd 0.6.1和0.7.1打開我的xls長度的字符串參數文件兩個抱怨:xlrd:struct.error:解包需要512

Traceback (most recent call last): 
    File "../../xls2csv.py", line 53, in <module> 
    book = xlrd.open_workbook(args[0]) 
    File "build/bdist.linux-i686/egg/xlrd/__init__.py", line 366, in open_workbook 

    File "build/bdist.linux-i686/egg/xlrd/__init__.py", line 760, in __init__ 

    File "build/bdist.linux-i686/egg/xlrd/compdoc.py", line 149, in __init__ 
struct.error: unpack requires a string argument of length 512 

我GOOGLE了四周,發現這建議幫助:

用open office打開xls文件並保存到新文件。問題就會消失。

爲了以防別人遇到同樣的問題,我在這裏發佈。

+1

-0。所以有一個程序,*自動* xls轉換爲csv,並遇到一個錯誤。您的解決方案是在開放式辦公室中手動打開文件並重新保存它?這不再是一個自動化過程,因此也不是真正的解決方案。如果您是在開放式辦公室手動打開它,則可以直接從開放式辦公室將其保存爲csv。 – 2012-01-31 15:18:57

回答

1

如果您有一個可在Excel,OpenOffice Calc或Gnumeric中打開確定但未由xlrd打開的xls文件,那麼您應該通過電子郵件向xlrd作者(詞法點網絡中的sjmachin)發送詳細信息和該文件的副本,以便xlrd可以得到改進;這將有利於您和所有其他xlrd用戶。

檢查源後更新

,你提供的是從古董0.6.1版本的堆棧跟蹤;你爲什麼在使用它?

根據我對代碼的閱讀,xlrd應該發出這樣的消息:`警告*文件大小(SIZE)不是512 +扇區大小的倍數(512)'...做到了嗎?

這已經超出規範。通常原因是數據有效載荷(Workbook流)不是512字節的倍數,它是寫入的最後一個結構,作者也沒有打算將其填充。在這種情況下,繼續下去是安全的,因爲缺少填充將不被訪問。

然而,在你的情況下,當文件大小大於大約7 MB時,xlrd脫離文件末尾,它跟隨一系列索引扇區(MS稱之爲「雙重間接FAT」)。 。每個扇區中的最後4個字節包含鏈中下一個扇區的扇區號(或一個特殊的鏈尾值)。因此,如果其中一個扇區小於512字節,則文件損壞。從那個甚至沒有警告信息中恢復並不是我稱之爲好行爲的東西,也不是我會鼓吹SO用戶依賴的東西。

請通過電子郵件與我聯繫,討論如何獲得此文件的副本(如有必要,在保密協議下)。