16

自分では制御できない 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 または Workbook の破損に関する情報を見つけることができません。

4

7 に答える 7

10

ラミエルに+1。compdoc.py以下の行( の行)425-27をコメントアウトするだけxlrd 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]))
于 2016-02-05T04:06:48.160 に答える
7

【pandasユーザーでお困りの方へWorkbook corruption: seen[2] == 4】XLSファイル読み込み時

注:xls xlrd はファイル以外のものをサポートしなくなりました。詳細と代替手段については、この回答を参照してください。

  1. xlrd2.0.0 以降を使用してください: https://pypi.org/project/xlrd/

  2. __init__.py自動的に読み込まれるファイルの 1 つに、パンダ用の独自の 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')

engine='custom_xlrd'使用するには、 XLSファイルを読み込むときに指定します

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

xlrdテスト対象の破損ファイルは次のとおりです。

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

于 2020-12-11T16:13:17.907 に答える
2

.xls ファイルの 1 つで同じエラーが発生しました (Excel で問題なく開くことができます)。問題はxlrd compdoc.pyにあります。私が推測するようにCompdoc.seen、配列はすでに読み取られた「FAT」セクターを追跡します。私の場合、ルート エントリ読み取りブロック (SSCS) は、表示済みとしてマークされたすべてのセクターを取得し、将来的に例外が発生する原因となります。Uは、セクター読み取りロジックのバグを見つけてxlrdに貢献することを試みることができます:)または、この行に例外発生をコメントしてください。

于 2013-11-15T09:05:15.810 に答える