问题描述
目前,我创建了一个 tar 文件并将其保存到硬盘中。然后,我读取 tar 文件以加密并保存加密版本。
但我的问题是我不需要 tar 文件并在过程结束时将其删除。 所以我觉得写tar文件是浪费时间。
我的代码看起来很简单:
import tarfile
import gnupg
......
with tarfile.open(name = tarpath,mode = 'w:xz') as tar:
for afile in files:
tar.add(name = afile)
......
with open(tarpath,'rb') as tarstream:
gpg.encrypt_file(tarstream,fingerprint,output = outpath)
代码的前半部分,tar文件保存到磁盘中。我可以避免这一步,直接将tar结果链接到gpg的输入中吗?
解决方法
您正在寻找的是 BytesIO
类。 BytesIO
类是一个处理字节流的类文件对象。
import tarfile
import gnupg
from io import BytesIO
tarstream = BytesIO()
with tarfile.open(fileobj = tarstream,mode = 'w:xz') as tar:
for afile in files:
tar.add(name = afile)
tarstream.seek(0)
gpg.encrypt_file(tarstream,fingerprint,output = outpath)
需要注意的要点是:
- 额外导入
- 将 tarstream 手动实例化为
BytesIO()
- 用
fileobj
参数代替name
参数 - 在使用 GPG 加密之前手动重置光标。
推荐的替代方案
正如评论中所讨论的,使用文件更好,以避免数据太大时出现内存问题。如果您不想担心记住手动删除文件,您可以使用tempfile.TemporaryFile
,它会在文件关闭时自动删除文件。
import tarfile
import gnupg
from tempfile import TemporaryFile
with TemporaryFile(mode='w+b') as tarstream:
with tarfile.open(fileobj = tarstream,mode = 'w:xz') as tar:
for afile in files:
tar.add(name = afile)
tarstream.seek(0)
gpg.encrypt_file(tarstream,output = outpath)