【发布时间】:2017-04-12 18:37:51
【问题描述】:
我是 Python 新手,一直在使用教科书和 StackOverflow 自学。我似乎从这个网站的真实世界例子中学到了最好的东西。我希望有人可以帮助我解决当前的问题。
我有一个包含大约 1,000 个文件的目录(文件夹)。这些文件的名称带有前缀(模式),例如aaa_*、bbb_*、ccc_* 等。我想遍历目录并复制所有具有指定前缀的文件并将它们移动到具有该前缀名称的新目录。例如,在/my_dir_path 中找到所有aaa_* 文件并将它们复制到/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_*'}
并将生成的文件作为值存储在适当的键下,但鉴于我什至还没有让递归工作(即打印),我还没有研究如何将结果复制到新目录。
【问题讨论】:
-
我不清楚递归的期望结果。您是说要在多个级别移动文件吗?用公共前缀重命名目录?
-
在原始目录中,有文件:aaa_1、aaa_2、aaa_n、bbb_4、bbb_6、bbb_7 等。我试图隔离所有那些是 'aaa_' 并复制/移动它们到一个标有“aaa”的文件夹,把所有的“bbb_”移到一个标有“bbb”的文件夹中。新目录(aaa、bbb 等)已经创建。
标签: python recursion filter directory os.walk