Распакуйте файлы gz в папки в основной папке, используя python

У меня есть ZIP-файлы.gz в нескольких папках, которые находятся в основной папке с именем "usa". Мне удалось извлечь отдельный файл, используя код ниже.

import gzip
import shutil
source=r"C:\usauc300.dbf.gz"
output=r"C:\usauc300.dbf"
with gzip.open(source,"rb") as f_in, open(output,"wb") as f_out:
    shutil.copyfileobj(f_in, f_out)

Я искал максимум и минимум, но не могу найти эквивалент опции командной строки gzip -dr..... что означает "распаковать рекурсивный" и будет проходить через каждую папку и извлекать содержимое в одно и то же место при удалении исходного заархивированного файла. Кто-нибудь знает, как я могу использовать python для циклического перемещения по папкам внутри папки, поиска любых заархивированных файлов и разархивирования их в одно и то же место при замене разархивированного файла на заархивированный?

3 ответа

Решение

Я считаю, что это потому, что gzip никогда не работает с каталогами, он действует как алгоритм сжатия в отличие от zip и tar, где мы можем сжимать каталоги. Реализация Python в gzip заключается в работе с файлами. Однако рекурсивный обход дерева каталогов легко, если мы посмотрим на вызов os.walk.

(Я не проверял это)

def gunzip(file_path,output_path):
    with gzip.open(file_path,"rb") as f_in, open(output_path,"wb") as f_out:
        shutil.copyfileobj(f_in, f_out)

def recurse_and_gunzip(root):
    walker = os.walk(root)
    for root,dirs,files in walker:
        for f in files:
            if fnmatch.fnmatch(f,"*.gz"):
                gunzip(f,f.replace(".gz",""))

Это похоже на работу для Shutil.unpack_archive .

Например:

      import shutil

shutil.unpack_archive(
    filename='path/to/archive.tar.gz', extract_dir='where/to/extract/to'
)

Вы тоже можете использовать этот формат.

      import tarfile, glob
base_dir = '/home/user/pipelines/data_files/'
    
for name in glob.glob(base_dir + '*.gz'):
     print(name)
     tf = tarfile.open(name)
     tf.extractall(base_dir + 'unzipped_files/')
     print('-- Done') 
Другие вопросы по тегам