我有两个带图片的文件夹。设两个文件夹名称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))
答案 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)