如何使用python查找几乎相同的文件名并将其从一个文件夹复制到另一个文件夹?

时间:2019-04-27 14:31:10

标签: python python-3.x

我有一个包含大量文件(mask_folder)的文件夹。此文件夹中的文件名构建如下:

  • asdgaw-1454_mask.tif
  • lkafmns-8972_mask.tif
  • sdnfksdfk-1880_mask.tif

在另一个文件夹(test_folder)中,我有较少数量的文件,文件名写的几乎相同,但是没有添加_mask。喜欢:

  • asdgaw-1454.tif
  • lkafmns-8972.tif

我需要一个代码来查找mask_folder中与test_folder中的文件具有相同文件名开头的文件,然后将这些文件从mask_folder复制到test_folder

通过这种方式,test_folder包含如下配对文件:

  • asdgaw-1454_mask.tif
  • asdgaw-1454.tif
  • lkafmns-8972_mask.tif
  • lkafmns-8972.tif

这是我尝试过的方法,它运行时没有任何错误,但没有任何反应:

import shutil
import os

mask_folder = "//Mask/"
test_folder = "//Test/"

n = 8
list_of_files_mask = []
list_of_files_test = []
for file in os.listdir(mask_folder):
    if not file.startswith('.'):
        list_of_files_mask.append(file)
        start_mask = file[0:n]
    print(start_mask)

for file in os.listdir(test_folder):
    if not file.startswith('.'):
        list_of_files_test.append(file)
        start_test = file[0:n]
    print(start_test)

for file in start_test:
    if start_mask == start_test:
        shutil.copy2(file, test_folder)

我搜索了过去的一段时间,但没有找到上述问题的解决方案。因此,我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先,您只想获取文件,而不是文件夹,因此您可能应该使用os.walk()而不是listdir()来使解决方案更可靠。在this question中进一步了解它。

然后,我建议将测试文件夹的文件名加载到内存中(因为它们是较小的部分),然后不要将所有其他文件也加载到内存中,而是立即复制它们。

import os
import shutil
test_dir_path = ''
mask_dir_path = ''

# load file names from test folder into a list
test_file_list = []
for _, _, file_names in os.walk(test_dir_path):
    # 'file_names' is a list of strings
    test_file_list.extend(file_names)

    # exit after this directory, do not check child directories
    break

# check mask folder for matches
for _, _, file_names in os.walk(mask_dir_path):
    for name_1 in file_names:
        # we just remove a part of the filename to get exact matches
        name_2 = name_1.replace('_mask', '')

        # we check if 'name_2' is in the file name list of the test folder
        if name_2 in test_file_list:
            print('we copy {} because {} was found'.format(name_1, name_2))
            shutil.copy2(
                os.path.join(mask_dir_path, name_1),
                test_dir_path)

    # exit after this directory, do not check child directories
    break

这可以解决您的问题吗?