我有一个包含大量文件(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)
我搜索了过去的一段时间,但没有找到上述问题的解决方案。因此,我们非常感谢您的帮助。
答案 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
这可以解决您的问题吗?