【问题标题】:Adding a BytesIO to a BytesIO tar.gz in python在 python 中将 BytesIO 添加到 BytesIO tar.gz
【发布时间】:2018-11-14 17:44:01
【问题描述】:

我在 Python 中从 BytesIO 对象编写 .tar.gz 文件时遇到问题。只编写一个普通的 tar 文件效果很好,但如果我将写入模式更改为 .tar.gz(或 bz 或 xz),它不会生成有效的 tar 文件。

我在下面做了一个精简版:

def string_to_tarfile(name, string):
    encoded = string.encode('utf-8')
    s = BytesIO(encoded)

    tar_info = tarfile.TarInfo(name=name)
    tar_info.mtime=time.time()
    tar_info.size=len(encoded)

    return s, tar_info

file1='hello'
file2='world'

f=BytesIO()
tar = tarfile.open(fileobj=f, mode='w:gz')
string, tar_info = string_to_tarfile("file1.txt", file1)
tar.addfile(tarinfo=tar_info, fileobj=string)

string, tar_info = string_to_tarfile("file2.txt", file2)
tar.addfile(tarinfo=tar_info, fileobj=string)

f.seek(0)
with open('whatevs.tar.gz', 'wb') as out:
    out.write(f.read())

这应该做的是制作一个包含“file1.txt”和“file2.txt”的whatevs.tar.gz文件。

如果我将 'w:gz' 替换为 'w'(并删除 .gz 结尾),我会得到一个内容正确的 tar 文件,但将其重新添加会导致 10 字节损坏的 tar.gz 文件

我想把它写到一个 bytesio,因为我实际上是把它上传到 S3。

我不确定我是否严重误读了这里的文档,我已经浏览了一百万个帖子,他们要么制作 tar 文件(效果很好,但我不想要),要么写入本地文件系统(再次,我正在上传到S3,我不想在本地写它)。

谢谢!

【问题讨论】:

    标签: python tar bytesio


    【解决方案1】:

    我认为关闭 tarfile 对象将解决您的问题。

    f = BytesIO()
    tar = tarfile.open(fileobj=f, mode='w:gz')
    string, tar_info = string_to_tarfile("file1.txt", file1)
    tar.addfile(tarinfo=tar_info, fileobj=string)
    
    string, tar_info = string_to_tarfile("file2.txt", file2)
    tar.addfile(tarinfo=tar_info, fileobj=string)
    tar.close() # <-- 
    

    为了不遇到这种打开文件的问题,我认为使用with这样的语句会更安全:

    f = BytesIO()
    with tarfile.open(fileobj=f, mode='w:gz') as tar:
        string, tar_info = string_to_tarfile("file1.txt", file1)
        tar.addfile(tarinfo=tar_info, fileobj=string)
    
        string, tar_info = string_to_tarfile("file2.txt", file2)
        tar.addfile(tarinfo=tar_info, fileobj=string)
    

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 2020-08-27
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多