Python 在文件夹和子文件夹中搜索以条件开头的文件

Python 在文件夹和子文件夹中搜索以条件开头的文件,python,Python,我有一个文件夹c:\test,文件夹test包含许多子文件夹和文件.xml、.wav。我需要在所有文件夹中搜索测试文件夹和所有子文件夹中的文件,从数字4开始,长度为7个字符,然后使用python将这些文件复制到另一个名为“c:\test.copy”的文件夹中。需要忽略任何其他文件 到目前为止,我可以使用以下方法将以4开头但不是结构的文件复制到新文件夹中: from glob import glob import os, shutil root_src_dir = r'C:/test'

我有一个文件夹c:\test,文件夹test包含许多子文件夹和文件.xml、.wav。我需要在所有文件夹中搜索测试文件夹和所有子文件夹中的文件,从数字4开始,长度为7个字符,然后使用python将这些文件复制到另一个名为“c:\test.copy”的文件夹中。需要忽略任何其他文件

到目前为止,我可以使用以下方法将以4开头但不是结构的文件复制到新文件夹中:

from glob import glob

import os, shutil

root_src_dir = r'C:/test'    #Path of the source directory
root_dst_dir = 'c:/test.copy'  #Path to the destination directory

for file in glob('c:/test/**/4*.*'):
shutil.copy(file, root_dst_dir)
欢迎提供任何帮助

您可以使用:

导入操作系统 进口舒蒂尔 源目录的root\u src\u dir=r'C:/test'路径 root_dst_dir='c:/test.copy'路径到目标目录 对于根目录,在os.walkroot\u src\u dir中的文件: 对于文件中的文件: 如果file.startswith4和lenfile==7: shutil.copyos.path.joinroot,文件,根目录
如果7个字符是指没有文件扩展名的7个字符,则将lenfile==7替换为lenos.path.splitextfile[0]==7。

这可以使用os和shutil模块完成:

首先,我们需要建立源路径和目标路径。源应该是您正在复制的目录,目标应该是您要复制到的目录

source = r"/root/path/to/source"
destination = r"/root/path/to/destination"
接下来,我们必须检查目标路径是否存在,因为如果目标路径已经存在,shutil.copytree将引发FileExistError。如果它已经存在,我们可以删除该树并再次复制它。您可以将此代码块看作是简单地刷新重复目录:

if os.path.exists(destination):
    shutil.rmtree(destination)
shutil.copytree(source, destination)
然后,我们可以使用os.walk递归导航整个目录,包括子目录:

for path, _, files in os.walk(destination):
    for file in files:
        if not file.startswith("4") and len(os.path.splitext(file)[0]) != 7:
            os.remove(os.path.join(path, file))
    if not os.listdir(path):
        os.rmdir(path)
然后,我们可以循环遍历每个目录中的文件,并检查该文件是否不符合您的条件,从4开始,长度为7。如果它不满足条件,我们只需使用os.remove将其从目录中删除


最后一个if语句检查目录现在是否为空。如果删除文件后目录为空,我们只需使用os.rmdir删除该目录。

您是希望仅将文件复制到一个目录中,还是希望同时复制包含符合条件的文件的所有文件夹?例如,如果您正在搜索的目录中有一个子文件夹foo,其中包含一个文件4xxxxxx.yyy,那么您是应该将该文件夹foo复制到新目录中,还是仅复制到该文件中?正确。所以我有一个文件夹,它有子文件夹1,2,3,4,5,6等等,然后另一个文件夹是1-99等等。有些文件夹包含以4开头的文件,有些文件夹包含以其他数字或字母开头的文件。我只需要将从4开始的文件复制到新文件夹中,但保留它们最初的文件夹结构。希望这是有意义的。谢谢你,我现在只需要保持文件夹结构。这似乎是可行的,谢谢大家的帮助
for path, _, files in os.walk(destination):
    for file in files:
        if not file.startswith("4") and len(os.path.splitext(file)[0]) != 7:
            os.remove(os.path.join(path, file))
    if not os.listdir(path):
        os.rmdir(path)