codememo

xlrd로 Excel 파일 읽기

tipmemo 2023. 7. 2. 20:46
반응형

xlrd로 Excel 파일 읽기

제어할 수 없는 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

CompDoc 오류 또는 워크북 손상에 대한 정보를 찾을 수 없습니다. 심지어 보이는 [2] == 4 파트도 마찬가지입니다.

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())

라미엘에게 +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]))

이 답변에서 영감을 얻었지만, 조금 더 직접적인 답변입니다.

pd.read_message는 xlrd를 허용합니다.개체를 예약하여 다음 작업을 수행할 수 있습니다.

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

[팬더 사용자를 위해]Workbook corruption: seen[2] == 4] XLS 파일을 읽을 때

참고: xlrd는 더 이상 다음을 지원하지 않습니다.xls자세한 내용 및 대안은 이 답변을 참조하십시오.

  1. 사용xlrd2.0.0 이상: https://pypi.org/project/xlrd/ .

  2. Panda 전용 XLS 엔진을 추가합니다.__init__.py자동으로 로드되는 파일

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

내 .xls 파일 중 하나에서 동일한 오류가 발생했습니다(excel은 파일을 잘 열 수 있습니다).xlrd에 문제가 있습니다. compdoc.py역시Compdoc.seen배열은 이미 읽은 "FAT" 섹터를 추적합니다.이 경우 SSCS(Root Entry Reading Block)가 표시된 모든 섹터를 가져와 나중에 예외가 발생합니다.논리를 읽는 섹터에서 버그를 찾고 xlrd에 기여하려고 시도할 수 있습니다:) 또는 예외 상승을 사용하여 이 행에 주석을 달 수 있습니다. 이는 귀하의 경우 문제를 해결할 가능성이 높습니다(내 경우와 마찬가지로).

마지막 수단으로 .xls 파일을 .csv 파일로 저장한 다음 읽어볼 수 있습니다.

분명히 당신은 엑셀에서 여닫고 나서 열 수 있다고 하니 같은 노력입니다.

만약 당신의 스크립트가 그것들을 열기를 정말 원한다면, 당신이 윈도우 플랫폼에 있다면, 당신의 스크립트에서 엑셀을 열고 닫기 위해 pywin32를 사용하고, 동시에 파일을 열고 닫습니다.그게 효과가 있을지도 몰라요. (바보이지만 주변의 일이 될 수도 있어요.)

예(여기서 도난)

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의

네 알겠습니다

언급URL : https://stackoverflow.com/questions/12705527/reading-excel-files-with-xlrd

반응형