我有一个简短的程序,它收集文件夹/子文件夹中所有.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会在文件加密时出现加密错误?
谢谢,
佛瑞德
答案 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