Небольшое изменение к полезному принятому ответу , так что оно работает как с питоном 3, так и с питоном 2 (и немного ближе соответствует примеру ОП):
from io import BytesIO
import tarfile
import time
# create and open empty tar file
tar = tarfile.open("test.tgz", "w:gz")
# Add a file
file1_contents = BytesIO("hello 1".encode())
finfo1 = tarfile.TarInfo(name='file1.txt')
finfo1.size = len(file1_contents.getvalue())
finfo1.mtime = time.time()
tar.addfile(tarinfo=finfo1, fileobj=file1_contents)
# create directory in the tar file
dinfo = tarfile.TarInfo(name='dir')
dinfo.type = tarfile.DIRTYPE
dinfo.mode = 0o755
dinfo.mtime = time.time()
tar.addfile(tarinfo=dinfo)
# add a file to the new directory in the tar file
file2_contents = BytesIO("hello 2".encode())
finfo2 = tarfile.TarInfo(name='dir/file2.txt')
finfo2.size = len(file2_contents.getvalue())
finfo2.mtime = time.time()
tar.addfile(tarinfo=finfo2, fileobj=file2_contents)
tar.close()
В частности, я обновил восьмеричный синтаксис после PEP 3127 - Поддержка целочисленных литералов и синтаксис , переключен на BytesIO from io
, использовал getvalue
вместо buf
и использовал open
вместо TarFile
, чтобы показать сжатый вывод как в примере. (Использование обработчика контекста (with ... as tar:
) также работало бы как в python2, так и в python3, но вырезка и вставка не работали с моим repthon python2, поэтому я не переключал его.) Протестировано на python 2.7.15+ и python 3.7 0,3.