Как сохранить файлы с таким же именем в папке в Python? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть две папки с изображениями.Пусть две папки имеют имена A и B. A содержит 100 файлов, а B содержит только 80 файлов.Оба файла имеют одинаковые имена.Я хочу сохранить только 80 файлов из A, который имеет такое же соответствие B в папке C.

Вот часть моего кода.Однако выдает ошибку:

Обязательный аргумент '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 ]

2 голосов
/ 07 июля 2019

Ваша проблема здесь в том, что вы не передаете файловый объект cv2.imwrite(os.path.join(save_path,img_name)) при попытке выполнить копирование;это то, что говорит вам ошибка.

Однако, ваш текущий подход включает в себя вложенный цикл for, который даст низкую производительность.Если вы хотите знать только те файлы, которые имеют общие каталоги, вы можете создать set имен файлов в каждом каталоге и найти пересечение.Затем вам просто нужно перебрать общие файлы и скопировать их (как сказано в комментариях, здесь нет необходимости в cv2 - они могут быть изображениями, но это просто обычные файлы, которые можно копировать).

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))
0 голосов
/ 07 июля 2019

Метод any () возвращает True, если какой-либо элемент итерируемого равен 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...