繁体   English   中英

在python中将BytesIO添加到BytesIO tar.gz

[英]Adding a BytesIO to a BytesIO tar.gz in python

我无法从BytesIO对象用Python编写.tar.gz文件。 只写一个普通的tarfile效果很好,但是如果我将写模式更改为.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结尾),我将获得具有正确内容的tarfile,但是将其添加回会导致10字节损坏的tar.gz文件

我想将其写入bytesio,因为实际上是将其上传到S3。

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

谢谢!

我认为关闭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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM