有没有办法在python中链接tarfile生成和gnupg加密



我想制作一个目录的tar文件并加密tar文件。

目前,我创建了一个tar文件并将其保存到HDD中。然后,我读取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, fingerprint, output = outpath)

最新更新