[英]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.