error:unpack需要长度为8的字符串参数

时间:2013-11-18 09:35:30

标签: python-2.7 xlrd

我正在运行我的脚本,我偶然发现了这个错误

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宏保存在我的驱动器中。未经处理的数据正在增加,这就是为什么我转而使用脚本来缓解工作的原因。

1 个答案:

答案 0 :(得分:0)

是谁制作了转储此文件的Outlook宏? xlrd使用字节级解包来读取Excel文件,并且无法读取此excel文件中的字段。有一些方法可以跟踪失败的地方,但没有办法从这种类型的错误中自动恢复。

错误的数据似乎是特定帧的data[4:12](我们稍后会看到),它应该是一个被解析的字节串:

  1. 一个整数(i)
  2. 2个填充字节(xx)
  3. 无符号短2字节整数(H)。
  4. 您可以将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_DIMENSIONXL_DIMENSION2值。这些直接对应于Excel工作表的形状。

    这就是你的工作簿中存在问题的地方。它没有正确制作。那么,回到我原来的问题,谁制作了excel宏?它需要修复。但那是另一个SO问题,其他时间。