Как создать несколько папок с именами и извлечь несколько zip-файлов в каждую другую папку с помощью python? - PullRequest
3 голосов
/ 07 июня 2019

У меня проблемы с созданием множества разных каталогов для множества разных папок zip, содержащих разные растровые данные, и затем извлечения всех архивов в новые папки чистым скриптом.

Я выполнил свою задачу, мой код очень длинный и грязный. Мне нужно иметь папки с метками NE34_E, NE35_E и т. Д., А затем в этих каталогах мне нужны подпапки, такие как N34_24, N34_25 и т. Д., В которые будут извлечены растровые данные. У меня есть более 100 zip-файлов, которые необходимо извлечь и поместить в подпапки.

После внесения некоторых изменений в способ создания каталогов это образец моего сценария.

Моя файловая структура выглядит следующим образом:

N\\N36_E\\N36_24
N\\N36_E\\N35_25
... etc.

Имена Zipfile:

n36_e024_1arc_v3_bil.zip
n36_e025_1arc_v3_bil.zip
n36_e026_1arc_v3_bil.zip
... etc.

Python-код для создания структуры каталогов:

import os

#Create Sub directories for "NE36_"
pathname1 = "NE36_"
pathname2 = 24
directory = "D:\\Capstone\\Test\\N36_E\\" + str(pathname1) + str(pathname2)
while pathname2 < 46:
    if not os.path.exists(directory):
        os.makedirs(directory)
    pathname2 += 1
    directory = "D:\\Capstone\\Test\\N36_E\\" + str(pathname1) + str(pathname2)

#Create Sub directories for "NE37_"
pathname1 = "NE37_"
pathname2 = 24
directory = "D:\\Capstone\\Test\\N37_E\\" + str(pathname1) + str(pathname2)
while pathname2 < 46:
    if not os.path.exists(directory):
        os.makedirs(directory)
    pathname2 += 1
    directory = "D:\\Capstone\\Test\\N37_E\\" + str(pathname1) + str(pathname2)

1 Ответ

1 голос
/ 08 июня 2019
import glob, os, re, zipfile

# Setup main paths.
zipfile_rootdir = r'D:\Capstone\Zipfiles'
extract_rootdir = r'D:\Capstone\Test'

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

for zip_file in glob.iglob(os.path.join(zipfile_rootdir, '*.zip')):

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

    # Make all items in part uppercase using a list comprehension.
    part = [item.upper() for item in part]

    # Create a dict of the parts to make useful parts to be used for folder names.
    # E.g. from ['N', '36', 'E', '24']
    folder = {'outer': '{0}{1}_{2}'.format(*part),
              'inner': '{0}{2}{1}_{3}'.format(*part)}

    # Build the extraction path from each part.
    extract_path = os.path.join(extract_rootdir, folder['outer'], folder['inner'])

    # Perform the extract of all files from the zipfile.
    with zipfile.ZipFile(zip_file, 'r') as zip:
        zip.extractall(extract_path)

2 основных настроек для установки значений, а именно:

  1. zipfile_rootdir - это место, где находится zip-файл.
  2. extract_rootdir - это место для извлечения в.

r перед строкой рассматривается как необработанная строка, поэтому экранирование обратной косой черты не требуется.

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

Из zip-файла:

n36_e024_1arc_v3_bil.zip

извлекает последовательность деталей с использованием регулярного выражения:

n, 36, e, 24

Каждый элемент в верхнем регистре и используется для создания словаря с именем folders, содержащего ключи и значения:

'outer': 'N36_E'
'inner': 'NE36_24'

extract_path будет хранить полноепуть путем объединения extract_rootdir с folder['outer'] и folder['inner'].

Наконец, с помощью диспетчера контекста с использованием with будут извлечены zip-файлы.


Регулярное выражение:

re_pattern = re.compile(r'\A([a-zA-Z])(\d+)_([a-zA-Z])0{0,2}(\d+)')

Компиляция шаблона регулярного выражения перед циклом позволяет избежать нескольких компиляцийшаблон в цикле.Использование r перед строкой означает информирование Python о том, что строку следует интерпретировать как необработанную, то есть без обратной косой черты.Необработанные строки полезны для регулярных выражений, поскольку для шаблонов используется экранирование обратной косой черты.

Шаблон регулярного выражения:

\A([a-zA-Z])(\d+)_([a-zA-Z])0{0,2}(\d+)

Строка для работы регулярного выраженияon:

n36_e024_1arc_v3_bil.zip
  1. \A Соответствует только в начале строки.Это якорь и не соответствует ни одному символу.
  2. ([a-zA-Z]) Соответствует любому символу алфавита.[] соответствует любым символам внутри.Любой символ в диапазоне от a до z и A до Z совпадает.n будет сопоставлено.* () - это хранилище этой группы, захваченной в возвращенную последовательность.Таким образом, последовательность теперь n,.
  3. (\d+) Соответствует 1 цифре или более.\d - это любая цифра, а + указывает, чтобы она соответствовала больше.Последовательность становится n, 36,.
  4. _ является буквальной и, поскольку () не содержит ее, она сопоставляется, хотя и не добавляется в последовательность.
  5. ([a-zA-Z]) То же, что и точка2. Последовательность становится n, 36, e,.
  6. 0{0,2} Соответствует нулю 0, от 0 до 2 раз {0,2}.Нет (), поэтому не добавляется в последовательность.
  7. (\d+) То же, что в пункте 3. Последовательность становится n, 36, e, 24.
  8. Остальная часть строки игнорируется при достижении шаблонавсе кончено.Вот почему используется \A, поэтому шаблон не может никуда начинаться и продолжаться до конца ненужной строки.

Форматирование:

Последовательность N, 36, E, 24после заглавных букв в понимании списка.

  1. Шаблон {0}{1}_{2} упорядочен 0, 1, 2, поэтому 0 - N, 1 - 36 и 2 - E, чтобы стать N36_E._ буквально в шаблоне.
  2. Шаблон {0}{2}{1}_{3} упорядочен 0, 2, 1, 3.0 - N, 2 - E, 1 - 36 и 3 - 24, чтобы стать NE36_24.

Ссылки:

  • Python 2:

    • re модуль для регулярных выражений.
    • format метод для форматированиястрок.
    • список пониманий используется для прописных элементов в последовательности.
    • zipfile модуль для работы с zip-архивами.
  • Python 3:

    • re модуль для регулярных выражений.
    • format метод для форматирования строк.
    • список пониманий используется для прописных элементов в последовательности.
    • zipfile модуль для работы спочтовые архивы.
...