Как извлечь несколько файлов tar.gz в каталог? - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь извлечь несколько файлов tar.gz безуспешно.

Я пытался изменить код, который использовал для распаковки zip-файлов.Ниже моя файловая структура, файлы и некоторый код.

Структура файла:

D:\\Test\\Tar

Имена файлов:

DZB1212-500258L004001_4.tgz
DZB1213-500119L002001_2.tgz
DZB1213-500119L006001_6.tgz

Код, который я пробовал:

import glob
import os
import re
import tarfile
import gzip
import shutil
os.chdir('E:\\SPRING2019\\SILKROAD\\Folder_Extraction_Auto\\SRTM_DEMs\\TESTEXTRACTER3\\USGS_Declassified\\Declass2_2002')

#set up pathing
tarfile_rootdir = ('E:\\SPRING2019\\SILKROAD\\Folder_Extraction_Auto\\SRTM_DEMs\\TESTEXTRACTER3\\USGS_Declassified\\Declass2_2002')
extract_rootdir = ('E:\\SPRING2019\\SILKROAD\\Folder_Extraction_Auto\\TEST')

#process the zip files [a-zA-Z] to [\w] and removed the _ seperating the two WORKED!!!!!!!!!!!!
re_pattern = re.compile(r'\A([\w+]*)')
#CHANGED ABOVE CREATED HTO_O with no subfolers but all extracted
for tar_file in glob.iglob(os.path.join(tarfile_rootdir, '*.tar.gz')):
    part = re.findall(re_pattern, os.path.basename(tar_file))[0]
    part = [item.upper() for item in part]
    folder = {'outer': '{0}{1}{2}{3}'.format(*part), 'inner': '{0}{1}{2}{3}'.format(*part)}
    extract_path = os.path.join(extract_rootdir, folder['outer'])
    with tarfile.open(tar_file, 'r:gz') as tarfile:
        tar_file.extractall(extract_path)

Будет работать, ноничего не происходит.

Ответы [ 2 ]

2 голосов
/ 14 июня 2019
import glob, os, re, tarfile

# Setup main paths.
tarfile_rootdir = r'D:\SPRING2019\Tarfiles'
extract_rootdir = r'D:\SPRING2019\Test'

# Process the files.
re_pattern = re.compile(r'\A(\w+)-\d+[a-zA-Z]0{0,5}(\d+)')

for tar_file in glob.iglob(os.path.join(tarfile_rootdir, '*.tgz')):

    # Get the parts from the base tgz filename using regular expressions.
    part = re.findall(re_pattern, os.path.basename(tar_file))[0]

    # Build the extraction path from each part.
    extract_path = os.path.join(extract_rootdir, *part)

    # Perform the extract of all files from the zipfile.
    with tarfile.open(tar_file, 'r:gz') as r:
        r.extractall(extract_path)

Этот код основан на ответ на ваш последний вопрос. Из-за неопределенной информации о структура каталогов, я предоставлю структуру как Пример.

TGZ-файлы в D:\SPRING2019\Tarfiles:

DZB1216-500058L002001.tgz
DZB1216-500058L003001.tgz

Извлечение структуры каталогов в D:\SPRING2019\Test:

DZB1216
    2001
    3001

Пути к файлам .tgz извлекаются с помощью glob.

Из примера имени файла: DZB1216-500058L002001.tgz, регулярное выражение будет захватывать 2 группы:

  • \A - это якорь в начале строки.
    Это не группа .
  • (\w+), чтобы соответствовать DZB1216.
    Это 1-я группа .
  • -\d+[a-zA-Z]0{0,5} соответствует следующей группе.
    Это не группа .
  • (\d+), чтобы соответствовать 2001.
    Это 2-я группа .

Путь извлечения объединяется с использованием значений extract_rootdir, DZB1216 и 2001. Это приводит к D:\SPRING2019\Test\DZB1216\2001 в качестве пути извлечения.

Использование tarfile извлечет все из файла .tgz.

1 голос
/ 12 июня 2019

Похоже, ваши имена файлов * .tgz, но ваш глобус * .tar.gz!

...