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 основных настроек для установки значений, а именно:
zipfile_rootdir
- это место, где находится zip-файл. 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
\A
Соответствует только в начале строки.Это якорь и не соответствует ни одному символу. ([a-zA-Z])
Соответствует любому символу алфавита.[]
соответствует любым символам внутри.Любой символ в диапазоне от a
до z
и A
до Z
совпадает.n
будет сопоставлено.* ()
- это хранилище этой группы, захваченной в возвращенную последовательность.Таким образом, последовательность теперь n,
. (\d+)
Соответствует 1 цифре или более.\d
- это любая цифра, а +
указывает, чтобы она соответствовала больше.Последовательность становится n, 36,
. _
является буквальной и, поскольку ()
не содержит ее, она сопоставляется, хотя и не добавляется в последовательность. ([a-zA-Z])
То же, что и точка2. Последовательность становится n, 36, e,
. 0{0,2}
Соответствует нулю 0
, от 0 до 2 раз {0,2}
.Нет ()
, поэтому не добавляется в последовательность. (\d+)
То же, что в пункте 3. Последовательность становится n, 36, e, 24
. - Остальная часть строки игнорируется при достижении шаблонавсе кончено.Вот почему используется
\A
, поэтому шаблон не может никуда начинаться и продолжаться до конца ненужной строки.
Форматирование:
Последовательность N, 36, E, 24
после заглавных букв в понимании списка.
- Шаблон
{0}{1}_{2}
упорядочен 0, 1, 2
, поэтому 0 - N
, 1 - 36
и 2 - E
, чтобы стать N36_E
._
буквально в шаблоне. - Шаблон
{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 модуль для работы спочтовые архивы.