我是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>
答案 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+'/')