xlrd:struct.error:unpack需要长度为512的字符串参数

时间:2012-01-31 13:52:01

标签: python xlrd

我正在使用xlrd 0.6.1和0.7.1来打开我的xls文件,两者都抱怨:

Traceback (most recent call last):
  File "../../xls2csv.py", line 53, in <module>
    book = xlrd.open_workbook(args[0])
  File "build/bdist.linux-i686/egg/xlrd/__init__.py", line 366, in open_workbook

  File "build/bdist.linux-i686/egg/xlrd/__init__.py", line 760, in __init__

  File "build/bdist.linux-i686/egg/xlrd/compdoc.py", line 149, in __init__
struct.error: unpack requires a string argument of length 512

我用Google搜索,发现这个建议有所帮助:

打开办公室的xls文件并保存到新文件。问题就会消失。

以防其他人遇到同样的问题,我在这里发布。

2 个答案:

答案 0 :(得分:1)

如果你有一个xls文件在Excel,OpenOffice Calc或Gnumeric中打开OK,但是没有被xlrd打开,那么你应该通过电子邮件发送xlrd作者(在lexicon dot net上的sjmachin)的详细信息和文件的副本,以便可以改进xlrd;这将使您和所有其他xlrd用户受益。

检查来源后

更新

您提供的堆栈跟踪来自古老的0.6.1版本;为什么你在使用它?

根据我对代码的解读,xlrd应该发出如下消息:`WARNING * 文件大小(SIZE)不是512 +扇区大小的倍数(512)'...它?

这已经超出了规范。通常原因是数据有效负载(工作簿流)不是512字节的倍数,它是写入的最后一个结构,并且编写者没有费心去填充它。在这种情况下,可以继续安全,因为将无法访问缺少的填充。

但是,在xlrd从文件末尾掉落的情况下,它遵循一系列索引扇区(MS称之为“双间接FAT”),当文件大小大于约7 MB时使用。每个扇区中的最后4个字节包含链中下一个扇区的扇区号(或特殊的链末端值)。因此,如果其中一个扇区短于512字节,文件已损坏。在没有警告信息的情况下从中恢复不是我称之为良好行为的东西,而不是我提倡SO用户依赖的东西。

请通过电子邮件与我联系,讨论如何获取此文件的副本(根据保密协议,如有必要)。

答案 1 :(得分:0)

在通过提供程序以程序创建的XLS上运行xlrd时,我也遇到了这个问题。

我的解决方案是运行libreoffice来转换文件,之后,我可以在文件上成功使用xlrd了!

libreoffice --headless --convert-to xls --outdir converted original/not_working.xls

我在Python3中的使用方式是:

from subprocess import call call(["libreoffice", "--headless", "--convert-to", "xls", "--outdir", "converted" , "original/not_working.xls"])

来源:

https://unix.stackexchange.com/questions/354043/convert-xlsx-to-xls-in-linux-shell-script#354054

https://www.computerhope.com/forum/index.php?topic=160219.0