Решение в Python 3 использует io.BytesIO
. Обязательно установите TarInfo.size
в длину байтов, а не в длину строки.
Для одной строки самое простое решение - вызвать .encode()
для получения байтов. В наши дни вы, вероятно, захотите UTF-8, но если получатель ожидает определенную кодировку, такую как ASCII (то есть без многобайтовых символов), используйте ее вместо этого.
import io
import tarfile
data = 'hello\n'.encode('utf8')
info = tarfile.TarInfo(name='foo.txt')
info.size = len(data)
with tarfile.TarFile('test.tar', 'w') as tar:
tar.addfile(info, io.BytesIO(data))
Если вам действительно нужен доступный для записи буфер string , аналогично принятому ответу @Stefano Borini для Python 2, тогда решение состоит в том, чтобы использовать io.TextIOWrapper
поверх базового буфера io.BytesIO
.
import io
import tarfile
textIO = io.TextIOWrapper(io.BytesIO(), encoding='utf8')
textIO.write('hello\n')
bytesIO = textIO.detach()
info = tarfile.TarInfo(name='foo.txt')
info.size = bytesIO.tell()
with tarfile.TarFile('test.tar', 'w') as tar:
bytesIO.seek(0)
tar.addfile(info, bytesIO)