微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在python中链接tarfile生成和gnupg加密? 推荐的替代方案

如何解决有没有办法在python中链接tarfile生成和gnupg加密? 推荐的替代方案

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

目前,我创建了一个 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。