我正在运行我的脚本,我偶然发现了这个错误
WARNING *** file size (24627) not 512 + multiple of sector size (512)
WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero
Traceback (most recent call last):
File "C:\Email Attachments\whatever.py", line 20, in <module>
main()
File "C:\Email Attachments\whatever.py", line 17, in main
csv_from_excel()
File "C:\Email Attachments\whatever.py", line 7, in csv_from_excel
sh = wb.sheet_by_name('B2B_REP_YLD_100_D_SQ.rpt')
File "C:\Python27\lib\site-packages\xlrd\book.py", line 442, in sheet_by_name
return self.sheet_by_index(sheetx)
File "C:\Python27\lib\site-packages\xlrd\book.py", line 432, in sheet_by_index
return self._sheet_list[sheetx] or self.get_sheet(sheetx)
File "C:\Python27\lib\site-packages\xlrd\book.py", line 696, in get_sheet
sh.read(self)
File "C:\Python27\lib\site-packages\xlrd\sheet.py", line 1055, in read
dim_tuple = local_unpack('<ixxH', data[4:12])
error: unpack requires a string argument of length 8
我正在尝试处理这个excel文件。 https://drive.google.com/file/d/0B12NevhOGQGRMkRVdExuYjFveDQ/edit?usp=sharing
我找到的一个解决方案是,我必须手动打开电子表格,保存它,然后在运行将.xls转换为.csv的脚本之前将其关闭。我发现这个解决方案有点麻烦和笨重。
此类电子表格每天通过Outlook宏保存在我的驱动器中。未经处理的数据正在增加,这就是为什么我转而使用脚本来缓解工作的原因。
答案 0 :(得分:0)
是谁制作了转储此文件的Outlook宏? xlrd
使用字节级解包来读取Excel文件,并且无法读取此excel文件中的字段。有一些方法可以跟踪失败的地方,但没有办法从这种类型的错误中自动恢复。
错误的数据似乎是特定帧的data[4:12]
(我们稍后会看到),它应该是一个被解析的字节串:
您可以将xlrd设置为DEBUG mode
,这将显示其解析的字节数,以及文件中出现错误的确切位置:
import xlrd
xlrd.DEBUG = 2
workbook = xlrd.open_workbook(u'/home/sparker/Downloads/20131117_040934_B2B_REP_YLD_100_D_LT.xls')
这是结果,为了SO而略微调整:
parse_globals: record code is 0x0293
parse_globals: record code is 0x0293
parse_globals: record code is 0x0085
CODEPAGE: codepage 1200 -> encoding 'utf_16_le'
BOUNDSHEET: bv=80 data '\xfd\x04\x00\x00\x00\x00\x18\x00B2B_REP_YLD_100_D_SQ.rpt'
BOUNDSHEET: inx=0 vis=0 sheet_name=u'B2B_REP_YLD_100_D_SQ.rpt' abs_posn=1277 sheet_type=0x00
parse_globals: record code is 0x000a
GET_SHEETS: [u'B2B_REP_YLD_100_D_SQ.rpt'] [1277]
GET_SHEETS: sheetno = 0 [u'B2B_REP_YLD_100_D_SQ.rpt'] [1277]
reqd: 0x0010
getbof(): data='\x00\x06\x10\x00\xbb\r\xcc\x07\x00\x00\x00\x00\x06\x00\x00\x00'
getbof(): op=0x0809 version2=0x0600 streamtype=0x0010
getbof(): BOF found at offset 1277; savpos=1277
BOF: op=0x0809 vers=0x0600 stream=0x0010 buildid=3515 buildyr=1996 -> BIFF80
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.macosx-10.4-x86_64/egg/xlrd/__init__.py", line 457, in open_workbook
File "build/bdist.macosx-10.4-x86_64/egg/xlrd/__init__.py", line 1007, in get_sheets
File "build/bdist.macosx-10.4-x86_64/egg/xlrd/__init__.py", line 998, in get_sheet
File "build/bdist.macosx-10.4-x86_64/egg/xlrd/sheet.py", line 864, in read
struct.error: unpack requires a string argument of length 8
具体来说,您可以看到它解析名为u'B2B_REP_YLD_100_D_SQ.rpt
的工作簿的名称。
让我们检查一下源代码。回溯引发错误here,我们可以从the parent loop看到我们正在尝试解析XL_DIMENSION
和XL_DIMENSION2
值。这些直接对应于Excel工作表的形状。
这就是你的工作簿中存在问题的地方。它没有正确制作。那么,回到我原来的问题,谁制作了excel宏?它需要修复。但那是另一个SO问题,其他时间。