繁体   English   中英

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

[英]xlrd: struct.error: unpack requires a string argument of length 512

我正在使用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

我四处搜寻,发现此建议有所帮助:

打开办公室打开xls文件,然后保存到新文件。 问题将消失。

以防万一有人遇到相同的问题,我在这里发布。

如果您有一个xls文件,可以在Excel,OpenOffice Calc或Gnumeric中打开“确定”,但没有被xlrd打开,则应通过电子邮件将其详细信息和副本发送给xlrd作者(词典点网处的sjmachin)。文件,以便可以改进xlrd; 这将使您和所有其他xlrd用户受益。

检查源代码后更新

您提供的堆栈跟踪来自旧的0.6.1版本。 为什么在地球上使用它?

根据我对代码的阅读,xlrd应该发出这样的消息:“警告*文件大小(SIZE)不是512 +扇区大小(512)的倍数” ...是吗?

这已经超出规格。 通常原因是数据有效负载(Workbook流)不是512字节的倍数,它是最后写入的结构,并且编写者没有费心将其填充。 在这种情况下,继续进行是安全的,因为不会访问丢失的填充。

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

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

在通过提供程序以过程创建的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM