将文件添加到 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)