Распакуйте файлы 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')