如何使用python创建具有名称的多个文件夹,并将多个zip解压缩到每个不同的文件夹?

2024-05-16 14:09:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难为包含不同光栅数据的多个不同zip文件夹创建许多不同的目录,然后在一个干净的脚本中将所有的zip解压到新文件夹中。在

我已经完成了我的任务,我的代码很长很乱。我需要有标记为NE34_ENE35_E等的文件夹,然后在这些目录中,我需要子文件夹,如N34_24N34_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)

Tags: test目录文件夹os光栅v3zipdirectory
1条回答
网友
1楼 · 发布于 2024-05-16 14:09:59
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_rootdirfolder['outer']和{}一起使用。在

最后,通过使用with使用上下文管理器,将提取zip文件。在


正则表达式:

^{pr2}$

以前正则表达式模式的编译 循环是为了避免模式的多次编译 在循环中。 在字符串之前使用r来通知Python 字符串应该被解释为原始的 i、 没有反斜杠转义。 原始字符串对于正则表达式很有用,例如 反斜杠转义用于模式。在

正则表达式模式:

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

正则表达式要处理的字符串:

n36_e024_1arc_v3_bil.zip
  1. \A只在字符串的开头匹配。 这是一个锚,与任何字符都不匹配。在
  2. ([a-zA-Z])匹配任何字母字符。 []与其中的任何字符匹配。 介于az和之间的任何字符 A到{}匹配。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是{} N36_E_是模式中的字面意思。在
  2. 模式{0}{2}{1}_{3}是有序的 0, 2, 1, 3。0是N,2是E,1是36 3是24变成{}。在

参考文献:

  • Python 2:

    • re模块,用于正则表达式。在
    • format字符串格式的方法。在
    • list comprehensions用于序列中的大写项目。在
    • zipfile用于处理zip存档的模块。在
  • Python 3:

    • re正则表达式的模块。在
    • format方法,用于设置字符串的格式。在
    • list comprehensions用于序列中的大写项目。在
    • zipfile用于处理zip存档的模块。在

相关问题 更多 >