簡體   English   中英

用xlrd讀取excel文件

[英]Reading excel files with xlrd

我在讀取由我無法控制的 Perl 腳本編寫的 .xls 文件時遇到問題。 這些文件在單元格中包含一些格式和換行符。

filename = '/home/shared/testfile.xls'
book = xlrd.open_workbook(filename)
sheet = book.sheet_by_index(0)
for rowIndex in xrange(1, sheet.nrows):
    row = sheet.row(rowIndex)

這引發了以下錯誤:

_locate_stream(Workbook): seen
    0  5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
   20  4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
172480= 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
172500  4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 2
172520  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
173840= 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
173860  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1
173880  1 1 1 1 1 1 1 1
Traceback (most recent call last):
  File "/home/shared/xlrdtest.py", line 5, in <module>
    book = xlrd.open_workbook(filename)
  File "/usr/local/lib/python2.7/site-packages/xlrd/__init__.py", line 443, in open_workbook
    ragged_rows=ragged_rows,
  File "/usr/local/lib/python2.7/site-packages/xlrd/book.py", line 84, in open_workbook_xls
    ragged_rows=ragged_rows,
  File "/usr/local/lib/python2.7/site-packages/xlrd/book.py", line 616, in biff2_8_load
    self.mem, self.base, self.stream_len = cd.locate_named_stream(qname)
  File "/usr/local/lib/python2.7/site-packages/xlrd/compdoc.py", line 393, in locate_named_stream
    d.tot_size, qname, d.DID+6)
  File "/usr/local/lib/python2.7/site-packages/xlrd/compdoc.py", line 421, in _locate_stream
    raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s]))
xlrd.compdoc.CompDocError: Workbook corruption: seen[2] == 4

我找不到任何關於 CompDocError 或工作簿損壞的信息,更不用說看到的 [2] == 4 部分了。

+1 給拉米爾。 在這些線路只是評論compdoc.py (線425-27xlrd 1.2.0 ):

if self.seen[s]:
    print("_locate_stream(%s): seen" % qname, file=self.logfile);dump_list(self.seen, 20, self.logfile)
    raise CompDocError("%s corruption: seen[%d] == %d" % (qname, s, self.seen[s]))

從 pkm 評論( 鏈接)來看,問題出在復合文件二進制文件上

#pip install OleFileIO-PL
import OleFileIO_PL
import pandas as pd

path = 'file.xls'
with open(path,'rb') as file:
    ole = OleFileIO_PL.OleFileIO(file)
    if ole.exists('Workbook'):
        d = ole.openstream('Workbook')
        x=pd.read_excel(d,engine='xlrd')
        print(x.head())

[對於Workbook corruption: seen[2] == 4有問題的熊貓用戶Workbook corruption: seen[2] == 4在閱讀 XLS 文件時Workbook corruption: seen[2] == 4 ]

注意: xlrd 不再支持xls文件以外的任何內容,有關詳細信息和替代方案,請參閱此答案

  1. 使用xlrd 2.0.0 或更高版本: https : xlrd

  2. 在自動加載的__init__.py文件之一中添加您自己的熊貓 XLS 引擎

from pandas.io.excel._xlrd import XlrdReader

class CustomXlrdReader(XlrdReader):

    def load_workbook(self, filepath_or_buffer):
        """Same as original, just uses ignore_workbook_corruption=True)"""
        from xlrd import open_workbook

        if hasattr(filepath_or_buffer, "read"):
            data = filepath_or_buffer.read()
            return open_workbook(file_contents=data, ignore_workbook_corruption=True)
        else:
            return open_workbook(filepath_or_buffer)


ExcelFile._engines['custom_xlrd'] = CustomXlrdReader
print('Monkey patching pandas XLS engines. See CustomXlrdReader')

要使用它,請在讀取 XLS 文件時指定engine='custom_xlrd'

df = pd.read_excel(filepath, engine='custom_xlrd')

這是測試xlrd的損壞文件:

https://github.com/python-excel/xlrd/blob/master/tests/samples/corrupted_error.xls

我的一個 .xls 文件出現了同樣的錯誤(excel 可以很好地打開它們)。 問題位於xlrd compdoc.py 我猜Compdoc.seen數組會跟蹤已讀取的“FAT”扇區。 在我的情況下,根條目讀取塊 (SSCS) 將所有扇區標記為可見,從而導致將來引發異常。 你可以嘗試找到扇區讀取邏輯中的錯誤並為 xlrd 做出貢獻:) 或者只是用異常引發注釋這一行,這可能會解決你的問題(就像我的情況一樣)並等待 xlrd 更新。

受到這個答案的啟發,但更直接:

pd.read_excel 接受 xlrd.Book 對象,因此您可以執行以下操作:

workbook = xlrd.open_workbook('file_name.xls', ignore_workbook_corruption=True)
excel = pd.read_excel(workbook)

也許作為最后的手段,您可以嘗試將 .xls 文件另存為 .csv 文件,然后嘗試閱讀它。

顯然你說你可以在從 Excel 打開和關閉之后打開它,所以這是同樣的努力。

如果你真的想讓你的腳本打開它們,那么如果你在 windows 平台上使用pywin32從你的腳本打開和關閉 Excel,並在同一個 go 中打開和關閉文件。 也許那可以奏效。 (愚蠢但可能是一種解決方法)

例子( 從這里偷來的

from win32com.client import Dispatch
xl = Dispatch('Excel.Application')
wb = xl.Workbooks.Open('C:\\Documents and Settings\\GradeBook.xls')

testfile.xls -----> 另存為 ---> 格式 97-2003 --->testfile2.xlc

文件名 = '/home/shared/testfile2.xls'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM