xlrd-错误“;工作簿已加密";,Python 3.2.3
我有一个简短的程序,它收集文件夹/子文件夹中所有.xls文件的列表,然后循环浏览文件列表,打开每个xls文档(Try:book=xlrd.open_工作簿(f))以查找特定信息。如果抛出异常,我会将文件名写入异常列表。我发现我有很多xlrd抛出错误的文件:xlrd-错误“;工作簿已加密";,Python 3.2.3,python,excel,encryption,xlrd,Python,Excel,Encryption,Xlrd,我有一个简短的程序,它收集文件夹/子文件夹中所有.xls文件的列表,然后循环浏览文件列表,打开每个xls文档(Try:book=xlrd.open_工作簿(f))以查找特定信息。如果抛出异常,我会将文件名写入异常列表。我发现我有很多xlrd抛出错误的文件: Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> book = xlrd.open_workbook(f)
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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
book=xlrd.open_工作簿(f)
文件“C:\Python32\lib\site packages\xlrd\\uuuuu init\uuuuuu.py”,第435行,在OpenU工作簿中
参差不齐的行=参差不齐的行,
文件“C:\Python32\lib\site packages\xlrd\book.py”,第116行,在open\u工作簿\u xls中
bk.parse_globals()
parse_globals中的文件“C:\Python32\lib\site packages\xlrd\book.py”,第1206行
self.handle_filepass(数据)
文件“C:\Python32\lib\site packages\xlrd\book.py”,第924行,在handle\u filepass中
引发XLRDError(“工作簿已加密”)
xlrd.biffh.xlrd错误:工作簿已加密
但是我可以用Excel打开文件,没有问题。有人知道为什么xlrd会在文件似乎未加密时抛出加密错误吗
谢谢
Fred我遇到了同样的问题,正如@zindorsky在他们的评论中提到的,当文件有一个受保护的工作表时,或者通过其他原因,Excel使用神奇密码对文件进行了静默加密 XLRD无法单独处理加密文件(事实上,该文件将其列为“不太可能完成”),但最近有另一个Python库可以对各种MS Office文件(包括.xls文件)进行解密 我能够使用它成功地解决这个问题——下面是代码的一个缩写(未经测试!)片段版本
import xlrd
import msoffcrypto
def handle_protected_workbook(wb_filepath):
try:
_book = xlrd.open_workbook(wb_filepath)
except xlrd.biffh.XLRDError, e:
if e.message == "Workbook is encrypted":
# Try and unencrypt workbook with magic password
wb_msoffcrypto_file = msoffcrypto.OfficeFile(open(wb_filepath, 'rb'))
try:
# Yes, this is actually a thing
# https://nakedsecurity.sophos.com/2013/04/11/password-excel-velvet-sweatshop/
wb_msoffcrypto_file.load_key(password='VelvetSweatshop')
except AssertionError, e:
if e.message == "Failed to verify password":
# Encrypted with some other password
raise # or do something else
else:
# Some other error occurred
raise
except:
# Some other error occurred
raise
else:
# Magic Excel password worked
assert wb_filepath.endswith('.xls')
wb_unencrypted_filename = wb_filepath[:-(len('.xls'))] + '__unencrypted.xls'
with tempfile.NamedTemporaryFile() as tmp_wb_unencrypted_file:
# Decrypt into the tempfile
wb_msoffcrypto_file.decrypt(tmp_wb_unencrypted_file)
# --- Do something with the file ---
# return true to indicate file was touched
return True # or do something else
else:
# some other xlrd error occurred.
return False # or do something else
except:
# some non-xlrd error occurred.
return False # or do something else
在此基础上,我创建了一个上下文管理器,可以根据需要透明地解密文件并负责清理
用途是:
将句柄受保护的工作簿(文件路径)作为wb的:
#使用wb
...
是否有(或曾经有过)任何“受保护”的工作表?当一张工作表被标记为受保护时,内部Excel将加密工作簿(使用固定密码“VelvetSweatshop”),以混淆受保护的工作表。打开加密工作簿时,Excel会先尝试密码“VelvetSweatshop”,这样用户就不会觉得它是加密的。