Jak mogę utworzyć plik .tar.gz z kompresją w Pythonie?
python
compression
zip
tarfile
shahjapan
źródło
źródło
Odpowiedzi:
Aby zbudować
.tar.gz
(aka.tgz
) dla całego drzewa katalogów:Spowoduje to utworzenie archiwum tar spakowanego gzipem, zawierającego pojedynczy folder najwyższego poziomu o tej samej nazwie i zawartości co
source_dir
.źródło
arcname=os.path.basename(source_dir)
otrzymasz całą strukturę ścieżeksource_dir
w pliku tar (w większości sytuacji jest to prawdopodobnie niewygodne).arcname=os.path.basename(source_dir)
nadal oznacza, że archiwum zawiera folder zawierający zawartośćsource_dir
. Jeśli chcesz, aby katalog główny archiwum zawierał samą zawartość, a nie zawartość folderu, użyjarcname=os.path.sep
zamiast tego.os.path.sep
, to archiwum będzie zawierało usługę "." lub folder „/”, co zwykle nie stanowi problemu, ale czasami może to być problem, jeśli później programowo przetworzysz to archiwum. Wydaje się, że jedynym naprawdę czystym sposobem jest robienieos.walk
i dodawanie plików indywidualniearcname='.'
. Nie ma potrzeby używaniaos.walk
.Jeśli chcesz utworzyć skompresowany plik tar.bz2, po prostu zamień rozszerzenie pliku na „.tar.bz2” i „w: gz” na „w: bz2”.
źródło
with tarfile.open( ..
w Pythonie, zamiast dzwonićopen
iclose
ręcznie. Dzieje się tak również w przypadku otwierania zwykłych plików.Nazywasz tarfile.open z
mode='w:gz'
, czyli „Otwórz za gzip skompresowanej formie pisemnej.”Prawdopodobnie będziesz chciał zakończyć nazwę pliku (
name
argument doopen
).tar.gz
, ale to nie wpływa na możliwości kompresji.Przy okazji, zwykle uzyskujesz lepszą kompresję w trybie
'w:bz2'
, tak jaktar
zwykle można kompresować nawet lepiejbzip2
niż w przypadkugzip
.źródło
Poprzednie odpowiedzi zalecają użycie
tarfile
modułu Python do tworzenia.tar.gz
pliku w Pythonie. To oczywiście dobre rozwiązanie w stylu Pythona, ale ma poważną wadę w szybkości archiwizacji. To pytanie wspomina, żetarfile
jest około dwa razy wolniejsze niżtar
narzędzie w systemie Linux. Z mojego doświadczenia wynika, że ta ocena jest całkiem poprawna.A więc dla szybszej archiwizacji możesz skorzystać z
tar
polecenia za pomocąsubprocess
modułu:źródło
W tym pliku tar.gz skompresuj w otwartym katalogu widoku W rozwiązaniu użyj os.path.basename (file_directory)
jego użycie w pliku tar.gz skompresuj w katalogu
źródło
Oprócz odpowiedzi @Aleksandr Tukallo, możesz również uzyskać dane wyjściowe i komunikat o błędzie (jeśli wystąpi). Poniższa odpowiedź
tar
dość dobrze wyjaśnia kompresję folderu za pomocą .źródło