将文件添加到 tar 存档而不先保存
Add file to tar archive without saving it first
是否可以直接在 tar 存档中创建文件?
上下文:我有一个方法可以创建某种类型的内容作为字符串。我想将此内容保存为 tar 存档中的文件。我必须创建一个 tmp 文件还是可以直接在 tar 存档中创建一个文件。
def save_files_to_tar(tarname):
archive = tarfile.open(tarname, mode='w')
for _ in range(some_number):
content = get_content()
# HERE add content to tar
我认为你应该使用 StringIO,创建一个类似内存对象的文件,并使用 tarInfo 来描述一个假文件,如下所示:
import StringIO
import tarfile
archive = tarfile.open(tarname, mode='w')
for _ in range(some_number):
content = get_content()
s = StringIO.StringIO()
s.write(content)
s.seek(0)
tarinfo = tarfile.TarInfo(name="my filename")
tarinfo.size = len(s.buf)
archive.addfile(tarinfo=tarinfo, fileobj=s)
archive.close()
希望对您有所帮助。
使用上下文管理器 Python 2 & 3 兼容的解决方案:
from __future__ import unicode_literals
import tarfile
import time
from contextlib import closing
from io import BytesIO
message = 'Lorem ipsum dolor sit amet.'
filename = 'test.txt'
with tarfile.open('test.tar', 'w') as tf:
with closing(BytesIO(message.encode())) as fobj:
tarinfo = tarfile.TarInfo(filename)
tarinfo.size = len(fobj.getvalue())
tarinfo.mtime = time.time()
tf.addfile(tarinfo, fileobj=fobj)
是否可以直接在 tar 存档中创建文件?
上下文:我有一个方法可以创建某种类型的内容作为字符串。我想将此内容保存为 tar 存档中的文件。我必须创建一个 tmp 文件还是可以直接在 tar 存档中创建一个文件。
def save_files_to_tar(tarname):
archive = tarfile.open(tarname, mode='w')
for _ in range(some_number):
content = get_content()
# HERE add content to tar
我认为你应该使用 StringIO,创建一个类似内存对象的文件,并使用 tarInfo 来描述一个假文件,如下所示:
import StringIO
import tarfile
archive = tarfile.open(tarname, mode='w')
for _ in range(some_number):
content = get_content()
s = StringIO.StringIO()
s.write(content)
s.seek(0)
tarinfo = tarfile.TarInfo(name="my filename")
tarinfo.size = len(s.buf)
archive.addfile(tarinfo=tarinfo, fileobj=s)
archive.close()
希望对您有所帮助。
使用上下文管理器 Python 2 & 3 兼容的解决方案:
from __future__ import unicode_literals
import tarfile
import time
from contextlib import closing
from io import BytesIO
message = 'Lorem ipsum dolor sit amet.'
filename = 'test.txt'
with tarfile.open('test.tar', 'w') as tf:
with closing(BytesIO(message.encode())) as fobj:
tarinfo = tarfile.TarInfo(filename)
tarinfo.size = len(fobj.getvalue())
tarinfo.mtime = time.time()
tf.addfile(tarinfo, fileobj=fobj)