Как сжать tar-файл в tar.gz без каталога?

Я ищу способ сжать файл tar в tar.gz без каталога.

Сегодня мой код генерирует файл TAR без каталога с библиотекой «tarfile» и аргументами arcname, но когда я хочу сжать этот файл TAR в TAR.GZ, я не понимаю, как удалить каталог.

Я сделал много тестов за последние 3 дня.

Мой код:

Tarname = example.tar
ImageDirectory = C:\...
TarDirectory = C:\..

tar = tarfile.open(Tarname, "w")
tar.add(ImageDirectory,arcname=TarName)
tar.close()

targz = tarfile.open("example.tar.gz", "w:gz")
targz.add(TarDirectory, arcname=TarName)
targz.close()

person syl3198045    schedule 15.01.2014    source источник
comment
Я не понимаю вопроса. Что вы получаете и что хотите получить взамен? Обратите внимание, что arcname относится не к имени архива, а к имени записи, добавляемой в tar-файл. Почему вы делаете example.tar, а затем example.tar.gz? Это просто сделает два разных файла.   -  person Mark Adler    schedule 15.01.2014
comment
Здравствуйте, Марк, я пытаюсь сгруппировать файлы tif и txt в файле TAR, а затем сжать этот файл в файле tar.gz. Для всех файлов я не хочу сохранять исходный каталог. Я понятен?   -  person syl3198045    schedule 16.01.2014
comment
Наконец, мне нужен каталог TARGZ\TAR\TIF, но мои файлы находятся не в том каталоге, который я использую для работы, и я вынужден передать каталог файлов, которые остаются в моих окончательных архивах...   -  person syl3198045    schedule 16.01.2014


Ответы (2)


Для отдельных файлов:

tar.add(file, arcname=os.path.basename(file))

для каждого файла, который вы хотите добавить. basename удалит информацию о каталоге.

Или, для рекурсивного каталога:

def flatten(tarinfo):
    tarinfo.name = os.path.basename(tarinfo.name)
    return tarinfo

tar = tarfile.open("example.tar.gz", "w:gz")
tar.add("directory", filter=flatten)
tar.close()
person Mark Adler    schedule 16.01.2014
comment
Спасибо, базовое имя не работает, но для вашего второго предложения, что такое имя, и не могли бы вы уточнить, когда tarinfo является функцией библиотеки tarfile и когда это переменная (например, TarInfo и tarinfo) - person syl3198045; 17.01.2014
comment
Вы сделали import os.path для basename? - person Mark Adler; 17.01.2014
comment
Вы можете прочитать документацию для tarinfo и tarinfo.name. - person Mark Adler; 17.01.2014
comment
фильтра не существует в моей версии Python :( - person syl3198045; 17.01.2014
comment
Какая у вас версия? - person Mark Adler; 17.01.2014
comment
У меня версия 2.5, и я должен сохранить ее. - person syl3198045; 17.01.2014
comment
2.5 имеет os.path и basename. Так что первый пример, который я дал, будет работать. Вам просто нужно будет выполнить рекурсию по каталогам самостоятельно, вместо того, чтобы зависеть от add для этого. Используйте listdir, чтобы просмотреть содержимое каталога, и пройдитесь по нему до add файлов. - person Mark Adler; 17.01.2014
comment
Привет ! Извините, но я не понимаю, не могли бы вы объяснить мне пример, пожалуйста? - person syl3198045; 20.01.2014

Попробуйте использовать модуль gzip: Вот пример того, как его использовать:

import gzip
f_in = open('file.txt', 'rb')
f_out = gzip.open('file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()
person Community    schedule 15.01.2014
comment
Да, я когда-либо пытался раньше, но тот же результат. Каталог всегда находится в конечном tar.gz. В gzip нет имени дуги? - person syl3198045; 15.01.2014
comment
Он уже использует "w:gz" при записи tar-файла, поэтому модуль gzip ему не нужен. - person Mark Adler; 15.01.2014