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

时间:2019-09-26 17:29:41

标签: python split directory path glob

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

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)))```



3 个答案:

答案 0 :(得分:0)

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

类似(代替您的new_dir分配):

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

答案 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

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

答案 2 :(得分:0)

完全可以使用Javier。 这是最终代码:


folder = 'C:/Test'

for file_path in glob.glob(os.path.join(folder, '*.*')):
    new_dir = file_path.replace('.', '_').replace(' ', '').split('_')[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)))