仅使用文件名的一部分从文件名创建文件夹

问题描述 投票:0回答:2

我想将目录中存在的文件移动到新文件夹中,该文件夹包含文件名中的特定字符串。这是我在目录中(数千个)中文件名的示例:

WS1_APAL4900.pdf
WS1_APAL4900_A.pdf
WS1_APAL4900_B.pdf
WS1_APAL4900_C.pdf
WS1_CANM0901.pdf
WS1_CANM0901_A.pdf
WS2_CANM0901.pdf
WS2_CANM0901_A.pdf
WS3_CANM0901.pdf
WS3_CANM0901_A.pdf
WS3_CONT6565.pdf

我的目标是将下划线定界符上的文件名称拆分为2或3个字符串,仅从左侧获取第二个,其中包含8个字/数字的字符串,并从中创建新文件夹,带有这样的名称:“ MFMO1720”,无论它是2个字符串还是3个字符串。现在,所有从左到下第一个下划线右边具有8个字符的文件,无论它们的名称是否不具有或具有_A,_B等,都应将其8个字符一起移动到新文件夹中名称

目前,当我运行代码时,带有'_x'的文件全部收集在一个文件夹下(即'APAL4900'文件夹包含'WS1_APAL4900_A.pdf','WS1_APAL4900_B.pdf'和'WS1_APAL4900_C.pdf',但不是' WS1_APAL4900.pdf')。没有_A,_B,_C等的文件将进入其名称具有.pdf扩展名的文件夹,即。 “ APAL4900.pdf”仅保存一个文件(WS1_APAL4900.pdf)。

[我尝试了split()和rsplit()以及其他拆分方法,但是它们都不能帮助我将具有相同8个字符的所有文件都获取到同一文件夹中。

任何帮助将不胜感激!

这里是代码:


folder = 'C:/test'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.rsplit('_', 2)[1]
    try:
        os.mkdir(os.path.join(folder, new_dir))
    except WindowsError:
        # Handle the case where the target dir already exist.
        pass
    shutil.move(file_path, os.path.join(new_dir, os.path.basename(file_path)))```



python split directory path glob
2个回答
0
投票

[如果要使其保持基本状态,而无需使用正则表达式,则可以替换为'。分割前用'_'表示。

所以类似(而不是您的new_dir分配):

new_dir = file_path.replace('.', '_').split('_')[1]

0
投票

添加到Dolfa的答案中。如果您确实想使用正则表达式,则可以执行以下操作:

import re
new_dir = re.split("_([a-zA-Z0-9]*)(_|\.)", file_path)[1]

此正则表达式基本上执行以下操作:

  • [_匹配字符_
  • [a-zA-Z0-9]*匹配0或更多a-z,A-Z或0-9范围内的字符
  • [_|\.匹配字符_或。
  • 将输出:

APAL4900
APAL4900
APAL4900
APAL4900
CANM0901
CANM0901
CANM0901
CANM0901
CANM0901
CANM0901
CONT6565

使用正则表达式的优点之一是,如果要将文件名约定更改为更复杂的名称,则可以轻松地对其进行调整以捕获所需的内容。在您的情况下,由于这是一个简单的字符串匹配,因此没有必要,因为这只会增加开销。

© www.soinside.com 2019 - 2024. All rights reserved.