迭代(或递归?)过滤目录并将结果复制到新目录

时间:2016-11-28 22:15:17

标签: python recursion filter directory os.walk

我是Python的新手,并且一直在教自己使用教科书和StackOverflow。我似乎从这个网站的真实世界的例子中学到了最好的东西。我希望有人可以帮我解决当前的问题。

我有一个包含大约1,000个文件的目录(文件夹)。这些文件的名称带有前缀(模式),例如aaa_*bbb_*ccc_*等。我想迭代目录并复制具有指定前缀的所有文件,并将它们移动到具有该前缀名称的新目录。例如,找到aaa_*中的所有/my_dir_path个文件,并将其复制到/my_new_dir_path/aaa,同样将bbb_*复制到/my_new_dir_path/bbb。新目录已经创建。

以下简单的样板脚本用于将其中一个前缀模式复制到新目录:

dir = '/my_dir_path'
pattern = 'aaa_*'
dest = '/my_new_dir_path/aaa'

for root, dirs, files in os.walk(dir):
    for filename in fnmatch.filter(files, pattern):
        source = (os.path.join(root, filename))
        shutil.copy2(source, dest)

我正在努力的是如何递归运行fnmatch.filter我的模式列表,然后最终将文件输出到他们自己的目录。

我尝试用模式列表*args编写了许多不同的函数定义,但通常会得到一条错误消息“filter()正好接受2个参数(给定3个)”。 (我为没有代码示例向您表示道歉而感到抱歉。过去几天我经历了很多版本,我没有任何代表性的函数定义。)

我是一个新手,我不知道fnmatch.filter是否可以递归或如何设计替代策略。然后,存在如何将每个模式搜索的结果文件存储到其自己的目录中的问题。我以为我可以提前创建一本字典,例如,

my_dict = {'my_new_dir_path/aaa': 'aaa_*', 'my_new_dir_path/bbb': 'bbb_*'}

并将结果文件存储为相应键下的值,但鉴于我甚至没有使递归工作(即打印),我还没有研究如何将结果复制到新目录。 / p>

1 个答案:

答案 0 :(得分:0)

现在我没有测试过这个,因为我没有要测试的所有文件。但是,我只是将“模式”变量设为列表并添加另一个for循环。我还更改了“dest”变量,因此我们可以使用“模式”列表。

dir = '/my_dir_path'
patterns = ['aaa', 'bbb', 'ccc']
dest = '/my_new_dir_path/'

for root, dirs, files in os.walk(dir):
    for pattern in patterns:
        for filename in fnmatch.filter(files, pattern+'_*'):
            source = (os.path.join(root, filename))
            shutil.copy2(source, dest+pattern+'/')