遍历文件夹/子目录并将找到的正则表达式文件移动到新文件夹中

时间:2019-08-28 09:52:21

标签: python-3.x glob python-os

我有一个文件夹/子目录结构,如下所示:

-main_folder
    -sub_1
         322.txt
         024.ops
    -sub_2
         977.txt
         004.txt
    -sub_3
         396.xml
         059.ops

我试图用os.walk遍历该文件夹及其子目录,并在这些文件夹中收集名称。当通过正则表达式规则找到名称时,我想将路径存储在列表中,或者直接将该文件移动到新文件夹(mkdir)中。

我已经完成了正则表达式来查找我想要的文档。 例如:

find_000_099 = r'\b(0\d{2}.\w{1,4})'
find_300_399 = r'\b(3\d{2}.\w{1,4})'
find_900_999 = r'\b(9\d{2}.\w{1,4})'

我希望我的预期结果是:

-main_folder
    -sub_from_000_099
         024.ops
         004.txt
         059.ops
    -sub_from_300_399
         322.txt
         396.xml
    -sub_from_900_999
         977.txt

2 个答案:

答案 0 :(得分:4)

您可以使用下面提供的代码,该文件将文件从其初始目录移动到所需目录。

import os
import re
import shutil

find_000_099 = r'\b(0\d{2}.\w{1,4})'
find_300_399 = r'\b(3\d{2}.\w{1,4})'
find_900_999 = r'\b(9\d{2}.\w{1,4})'

count = 0

for roots,dirs,files in os.walk('Directory Path'):
    #print(roots, len(dirs), len(files))
    if count == 0:
        parent_dir = roots
        os.mkdir ( parent_dir  + "/sub_from_000_099" )
        os.mkdir ( parent_dir  + "/sub_from_300_399" )
        os.mkdir ( parent_dir  + "/sub_from_900_999" )
        count += 1
    else:
        print(count)
        for file in files:
            print(file)
            if re.match(find_000_099, file):
                shutil.move ( roots + "/" + file, parent_dir + "/sub_from_000_099/" + file)
            elif re.match ( find_300_399, file ):
                shutil.move ( roots + "/" + file, parent_dir + "/sub_from_300_399/" + file )
            elif re.match ( find_900_999, file ):
                shutil.move ( roots + "/" + file, parent_dir + "/sub_from_900_999/" + file )

这是一个基本代码,可以满足您的要求。 您可以先检查目录是否存在,然后再根据需要进行其他检查,以添加创建目录的检查。

答案 1 :(得分:1)

这是使用pathlib和shutil的一种更简单的方法

import re
import shutil
from pathlib import Path

new_path = Path("new_folder")
if not new_path.exists(): new_path.mkdir()

# Getting all files in the main directory
files = Path("main_folder").rglob("*.*")

regs = {
    r'\b(0\d{2}.\w{1,4})': "sub_1", # find_000_099
    r'\b(3\d{2}.\w{1,4})': "sub_2", # find_300_399
    r'\b(9\d{2}.\w{1,4})': "sub_3"  # find_900_999
}

for f in files:
    for reg in regs:
        if re.search(reg, f.name):
            temp_path = new_path / regs[reg]
            if not temp_path.exists(): temp_path.mkdir()

            # Change the following method to 'move' after testing it
            shutil.copy(f, temp_path / f.name)
            break