在zipfile.ZipFile的帮助下,我能够访问/读取zip文件中的文件,而无需实际解压缩到文件夹中。
with zipfile.ZipFile('data.zip', 'rb') as zfile:
with zfile.open('fil.dat', 'r') as dfile:
csv_data = io.TextIOWrapper(dfile, encoding='utf-8')
....
....
现在,是否可以在加密的zip文件中读取/访问文件?压缩文件是使用gnupg
加密的
我有一个解决办法来解密和读取zip的内容,如下所示
import gnupg
gpg = gnupg.GPG()
with open('key.asc') as kfile:
key = kfile.read()
gpg.import_keys(key)
with open('data.zip.gpg', 'rb') as gfile:
gpg.decrypt_file(gfile, passphrase='password', output='data.zip')
这将在文件系统上创建一个新的解密压缩文件,允许我读取/访问zip文件中的文件,并且每次使用后都必须删除该文件。
是否可以将压缩文件解密为类似文件的对象并访问内容,而无需在文件系统上实际创建解密的zip文件?
我试过像下面这样的东西,但失败了。
import gnupg
gpg = gnupg.GPG()
with open('key.asc') as kfile:
key = kfile.read()
gpg.import_keys(key)
zip_file_obj = io.BytesIO()
with open('data.zip.gpg', 'rb') as gfile:
gpg.decrypt_file(gfile, passphrase='password', output=zip_file_obj)
上面的代码失败,错误的BytesIO类型不是有效的输入。
是否有办法为我的用例完成此或任何其他python包装/包?
注意:我正在使用python 3.6
错误:
Traceback (most recent call last):
File "gptester.py", line 15, in <module>
gpg.decrypt_file(gfile, passphrase='TESTTESTTEST', output=zip_file_obj)
File "/usr/local/lib/python3.6/site-packages/gnupg/gnupg.py", line 1093, in decrypt_file
if os.path.exists(output):
File "/usr/local/lib/python3.6/genericpath.py", line 19, in exists
os.stat(path)
TypeError: stat: path should be string, bytes, os.PathLike or integer, not _io.BytesIO
编辑- II
我根据所提供的建议尝试了这段代码
from io import BytesIO
from zipfile import ZipFile
import gnupg
with open('worker/key.asc') as kfile:
key = kfile.read()
gpg = gnupg.GPG()
gpg.import_keys(key)
zip_file_obj = BytesIO()
with open('data.zip.gpg', 'rb') as gfile:
decrypt_data = gpg.decrypt_file(gfile, passphrase='password')
zip_file_obj = BytesIO(decrypt_data)
错误:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/usr/local/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python3.6/site-packages/gnupg/_meta.py", line 650, in _read_response
result._handle_status(keyword, value)
File "/usr/local/lib/python3.6/site-packages/gnupg/_parsers.py", line 1294, in _handle_status
raise ValueError("Unknown status message: %r" % key)
ValueError: Unknown status message: 'PINENTRY_LAUNCHED'
Traceback (most recent call last):
File "gptester.py", line 17, in <module>
zip_file_obj = BytesIO(decrypt_data)
TypeError: a bytes-like object is required, not 'Crypt'
发布于 2019-12-16 00:54:26
文档显示您可以做到
decrypted_data = gpg.decrypt_file(gfile, passphrase='password')
在不写文件的情况下得到。
要创建类似文件的对象,需要decrypted_data.data
和
zip_file_obj = io.BytesIO(decrypted_data.data)
文档还提到了str(decrypted_data)
作为获取数据的方法。
https://stackoverflow.com/questions/59350971
复制