逃避感叹号python

时间:2015-08-18 14:12:27

标签: python-3.x

我试图提供带有感叹号的密码作为zipfile的extractall功能的密码的一部分,但有问题:

zf.extractall(pwd="password2015!")

我曾尝试过:将pwd作为字符串提供,这会返回一个类型错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python34\lib\zipfile.py", line 1240, in extractall
    self.extract(zipinfo, path, pwd)
  File "C:\Python34\lib\zipfile.py", line 1228, in extract
    return self._extract_member(member, path, pwd)
  File "C:\Python34\lib\zipfile.py", line 1290, in _extract_member
    with self.open(member, pwd=pwd) as source, \
  File "C:\Python34\lib\zipfile.py", line 1129, in open
    raise TypeError("pwd: expected bytes, got %s" % type(pwd))
TypeError: pwd: expected bytes, got <class 'str'>

我也试过提供pwd=password2015\!,但这会产生语法错误。

有谁知道为什么会返回这样的错误?我以为extractall应该期待一个字符串。

1 个答案:

答案 0 :(得分:8)

正如错误所说,它期待字节,而不是str。不确定为什么你认为感叹号是一个问题。使用其中一个:

zf.extractall(pwd=b'password2015!')
zf.extractall(pwd='password2015!'.encode('ascii'))

密码可能表示为不同编码中的不同字节,并且需要在字节级别与zip文件完全匹配。因此,该函数要求您自己处理编码并传递原始字节而不是字符串。