gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:42:20 26 4
gpt4 key购买 nike

我在 Python 中从 BytesIO 对象编写 .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' 替换 'w:gz'(并删除 .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)

关于python - 在 python 中将 BytesIO 添加到 BytesIO tar.gz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com