如何从多个目录复制特定文件并使用索引重命名 python

How to copy a particular file from multiple directories and rename with indexes using python

我想将特定文件从不同的目录复制到另一个目录。每个目录都有几个具有相同扩展名的文件。我想将一个特定文件从每个目录复制到另一个文件夹,并使用索引重命名该文件。 这是我当前的根目录树的示例。

root--Dir1--subDir1--subDir2
       |              |--x.bmp
       |              |--y.bmp
       |              |-t.txt
       Dir2--subDir1--subDir2
       |              |--x.bmp
       |              |--y.bmp
       |              |-t.txt
       Dir3--subDir1--subDir2
       |              |--x.bmp
       |              |--y.bmp
       |              |-t.txt

我只想复制x.bmp文件到其他目录。 我想要的目录将像下面给出的示例树一样。

NEWDIR
|--x1.bmp
|--x2.bmp
|--x3.bmp
.
.

我在其他帖子的帮助下写了一个示例代码块,但它给了我错误。 在这里我发布了代码片段和错误。

import os
import shutil
import glob

root_dir = 'oldDir'
dest_dir = 'NewDir'
os.listdir(root_dir)
for folder in os.listdir(root_dir):
    folder_path = os.path.join(root_dir, folder)
    if os.path.isdir(folder_path):
        for subfolder in os.listdir(folder_path):
            subfolder_path = os.path.join(root_dir, folder, subfolder)
            for subfolder2 in os.listdir(subfolder_path):
                subfolder2_path = os.path.join(root_dir, folder, subfolder,subfolder2)
            for filename in os.listdir(subfolder2_path):
                if filename == 'X.bmp':
                
                    file_path = os.path.join(root_dir, folder, subfolder, subfolder2,filename)
                    for i in filename:
                        filename = 'X.bmp'%(i,)
                        dest_path = os.path.join(dest_dir, filename)
                        shutil.copy(file_path, dest_path)
                        print("Copied ", file_path, "to", dest_path)

我收到的错误信息

TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_6448/526909518.py in <module>
     22                     #filename+=1
     23                     for i in filename:
---> 24                         filename = 'X.bmp'%(i,)
     25                         dest_path = os.path.join(dest_dir, filename)
     26                         shutil.copy(file_path, dest_path)

TypeError: not all arguments converted during string formatting

我在 Whosebug 中遇到了类似的问题,但答案对我没有帮助。我感谢这方面的帮助。

您可以使用 glob 来查找您需要的文件。示例如下

import glob, pathlib, shutil
root_dir = r"C:/drive/samples"
target_dir = pathlib.Path(r"C:/drive/samples/D2")
copy_files = list(glob.glob(f"{root_dir}/**/*.bmp",recursive=True))

index =1
for file in copy_files:
    file = pathlib.Path(file)
    target_file = target_dir / f"{file.stem}{index}{file.suffix}"
    shutil.copyfile(file, target_file)
    index+=1

可能对此有更多改进。但这是最简单的方法之一,