我无法从 BytesIO 对象用 Python 编写 .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,我不想在本地写)。
谢谢!