xlrd - 错误“工作簿已加密”,Python 3.2.3

时间:2014-04-01 15:14:03

标签: python excel encryption xlrd

我有一个简短的程序,它收集文件夹/子文件夹中所有.xls文件的列表,然后循环遍历文件列表,打开每个xls文档(尝试:book = xlrd.open_workbook(f))来查看了解具体信息。如果抛出异常,我会将文件名写入异常列表。我发现的是我有很多文件,xlrd会抛出错误:

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    book = xlrd.open_workbook(f)
  File "C:\Python32\lib\site-packages\xlrd\__init__.py", line 435, in open_workbook
    ragged_rows=ragged_rows,
  File "C:\Python32\lib\site-packages\xlrd\book.py", line 116, in open_workbook_xls
    bk.parse_globals()
  File "C:\Python32\lib\site-packages\xlrd\book.py", line 1206, in parse_globals
    self.handle_filepass(data)
  File "C:\Python32\lib\site-packages\xlrd\book.py", line 924, in handle_filepass
    raise XLRDError("Workbook is encrypted")
xlrd.biffh.XLRDError: Workbook is encrypted

但我可以用Excel打开文件没有问题。有没有人知道为什么xlrd会在文件加密时出现加密错误?

谢谢,

佛瑞德

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,正如@zindorsky在他们的评论中提到的那样,当文件具有受保护的工作表时可能会发生这种情况-或由于其他一些原因,Excel用魔术密码{{1 }}。

XLRD无法单独处理带有加密的文件(实际上README将其列为“不太可能完成”),但是最近又有一个Python库可以解密各种MS Office文件(包括.xls文件)-msoffcrypto-tool

我能够使用它成功解决该问题-这是该代码的缩写(未经测试!)片段

VelvetSweatshop

答案 1 :(得分:0)

nuclearpidgeon's answer的基础上,我创建了一个上下文管理器,可以根据需要透明地解密文件并负责清理。

用法是:

with handle_protected_workbook(filepath) as wb:
   # use wb
   ...

https://gist.github.com/terrdavis/b219e92d42dc5f9ca526aa0047d1a1d1