逃避感叹号python

use*_*123 -2 python-3.x

我正在尝试提供带有感叹号的密码作为密码的一部分,以解决zipfile的extractall功能:

zf.extractall(pwd="password2015!")
Run Code Online (Sandbox Code Playgroud)

我曾尝试过:将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'>
Run Code Online (Sandbox Code Playgroud)

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

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

dec*_*eze 8

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

zf.extractall(pwd=b'password2015!')
zf.extractall(pwd='password2015!'.encode('ascii'))
Run Code Online (Sandbox Code Playgroud)

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