如何在python的文件夹中保存相同名称的文件?

时间:2019-07-07 12:40:45

标签: python loops

我有两个带图片的文件夹。设两个文件夹名称A和B。A包含100个文件,B仅包含80个文件。这两个文件具有相同的名称。我只想保存A中与B具有相同对应关系的80个文件。

这是我的代码的一部分。但是,它会抛出错误:

  

未找到必需的参数'img'(位置2)。

path1= '/home/vplab/Kitty/Saliency Dataset/PiCANet-Implementation/TrainSet/images'
path_mask= '/home/vplab/Kitty/Saliency Dataset/PiCANet-Implementation/TrainSet/masks'
save_path = '/home/vplab/Kitty/Saliency Dataset/PiCANet-Implementation/TrainSet/exp'
for file in os.listdir(path1):
    for file1 in os.listdir(path_mask):
        img_name = file[:-4]
        mask_name =file1[:-4]
        if img_name == mask_name:
            cv2.imwrite(os.path.join(save_path,img_name)) 

2 个答案:

答案 0 :(得分:2)

您的问题是,尝试执行复制时没有将文件对象传递给cv2.imwrite(os.path.join(save_path,img_name));这就是错误告诉您的内容。

但是,您当前的方法包括嵌套的for循环,这会导致性能下降。如果只想知道目录共有的文件,则可以在每个目录中创建文件名的set并找到交集。然后,您只需要遍历公共文件并复制它们即可(如注释中所述,这里不需要cv2-它们可以是图像,但它们只是可以复制的常规文件)。 / p>

import os
from shutil import copyfile

dir_1 = 'A'
dir_2 = 'B'
output_dir = 'C'

files_1 = os.listdir(dir_1)
files_2 = os.listdir(dir_2)

# Find the common files between both
common_files = set(files_1).intersection(files_2)

# Copy the common files over.
for file in common_files:
    copyfile(os.path.join(dir_1, file),
             os.path.join(output_dir, file)) 

如果要从os.listdir中的文件中删除最后一个字符的原因是因为文件具有相同的名称,但扩展名不同,则只需要进行两个小修改(此处我假定扩展名是.png,需要稍后再添加):

files_1 = [item[:-4] for item in os.listdir(dir_1)]
files_2 = [item[:-4] for item in os.listdir(dir_2)]

并且:

for file in common_files:
    file = file + '.png' # Add the extension back on to the file name
    copyfile(os.path.join(dir_1, file),
             os.path.join(output_dir, file))

答案 1 :(得分:0)

如果可迭代的任何元素为True,则any()方法将返回True。如果不是,则any()返回False。 shutil.copy-将文件src复制到文件或目录dst。

import os
import shutil


def read_file(folderName,folderPath):
    ''' Return list of files name '''
    path = folderPath+folderName
    return [file for file in os.listdir(path)]

def save_file(soureFolderName,destFolderName,folderPath,fileName):
    ''' Save file on destination folder'''
    try:
        source_path = folderPath+soureFolderName+"/"+fileName
        dest_path = folderPath+destFolderName+"/"+fileName
        shutil.copy(source_path, dest_path)
    except Exception as e:
        print(e)

base_path = '/home/vplab/Kitty/Saliency Dataset/PiCANet-Implementation/TrainSet/'
folder_images_files = read_file('images',base_path)
folder_masks_file = read_file('masks',base_path)

for file_1 in folder_images_files:
    #Check folder A file is exists in folder B
    if any(file_1 == file_2 for file_2 in folder_masks_file):
        save_file("images","exp",base_path,file_1)