我在阅读由无法控制的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损坏的任何信息,甚至更少见[2] == 4部分。
答案 0 :(得分:6)
来自pkm注释(link)的问题是复合文件二进制文件
#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 :(得分:5)
给Ramiel +1。 只需在compdoc.py中注释这一行
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]))
答案 2 :(得分:2)
我的一个.xls文件出现了同样的错误(excel可以打开它们就好了)。问题位于 xlrd compdoc.py
。我猜Compdoc.seen
数组跟踪已经读过的“FAT”扇区。在我的情况下,根条目读取块(SSCS)获取标记为所见的所有扇区,导致将来异常提升。你可以尝试在读取逻辑的扇区中找到错误并为xlrd做贡献:)或者只是通过异常加注来注释这一行,这可能会解决你的问题(就像我的一样)并等待xlrd更新。
答案 3 :(得分:2)
[对于Workbook corruption: seen[2] == 4
有问题的熊猫用户],在读取XLS文件时
注意::xlrd不再支持xls
文件以外的任何文件,有关详细信息和替代方法,请参见this answer。
使用xlrd
2.0.0或更高版本:https://pypi.org/project/xlrd/。
在您的__init__.py
文件之一中为熊猫添加自己的XLS引擎,该文件会自动加载
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
答案 4 :(得分:0)
也许作为最后的手段,您可以尝试将.xls文件保存为.csv文件,然后尝试阅读它。
显然你说你可以在Excel打开和关闭后打开它,所以这是同样的努力。
如果你真的希望你的脚本打开它们,那么如果你在Windows平台上,使用pywin32从你的脚本打开和关闭Excel,并在同一个go中打开和关闭文件。也许这可行。 (愚蠢但可能是一个解决方法)
示例(stolen from here)
from win32com.client import Dispatch
xl = Dispatch('Excel.Application')
wb = xl.Workbooks.Open('C:\\Documents and Settings\\GradeBook.xls')
答案 5 :(得分:0)
受this answer的启发,但更直接:
pd.read_excel 接受 xlrd.Book 对象,所以你可以这样做:
workbook = xlrd.open_workbook('file_name.xls', ignore_workbook_corruption=True)
excel = pd.read_excel(workbook)
答案 6 :(得分:-1)
testfile.xls ----->另存为--->格式97-2003 ---> testfile2.xlc
文件名='/home/shared/testfile2.xls'
好