python - перемещение файлов и проверка дубликатов имен - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь создать код, который может перемещать файлы из одной папки в другую. Например, у меня есть файлы с именем 0001.jpg, 0002.jpg ... и т. Д. В папке / test1 /, и я хочу переместить эти файлы в папку / test3 /, если того же имени файла не существует в / test2 /. Таким образом, если файл 0001.jpg находится в папке / test1 / и / test2 /, файл в / test1 / не будет перемещен в папку / test3 /, но если имеется 0002.jpg в / test1 /, а не в / test2 /, он перемещается в /test/3.

Я пытался написать код самостоятельно, но он не работает. Можете ли вы помочь с этим? Заранее спасибо!

import os
import shutil

def Move_files(root_path, refer_path, out_path) :
    root_path_list= [file for file in os.listdir(root_path)]
    refer_path_list= [file for file in os.listdir(refer_path)]

    for file in root_path_list:
        if refer_path_list in root_path_list:
            shutil.move(os.path.join(os.listdir(root_path, file)),os.path.join(os.listdir(refer_path, file)))

if __name__ == '__main__' :
    Move_files("D:\\Dataset\\test1", "D:\\Dataset\\test2", "D:\\Dataset\\test3")

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Попробуйте это

import os
import shutil

def Move_files(root_path, refer_path, out_path) :
    root_path_list= [file for file in os.listdir(root_path)]
    refer_path_list= [file for file in os.listdir(refer_path)]

    for file in root_path_list:
        if file not in refer_path_list:
            shutil.move(os.path.join(os.listdir(root_path, file)),os.path.join(os.listdir(out_path, file)))

if __name__ == '__main__' :
    Move_files("D:\\Dataset\\test1", "D:\\Dataset\\test2", "D:\\Dataset\\test3")
1 голос
/ 08 апреля 2020

Вы можете использовать set, чтобы найти разницу между списками файлов. Я добавил проверку isfile, чтобы игнорировать подкаталоги (например, каталоги "." И ".." в linux), и поскольку shutil.move принимает целевой каталог, нет необходимости создавать имя целевого файла.

import os
import shutil

def Move_files(root_path, refer_path, out_path) :
    root_files = set(filename for filename in os.listdir(root_path)
        if os.path.isfile(filename))
    refer_files = set(filename for filename in os.listdir(refer_path)
        if os.path.isfile(filename))
    move_files = root_files - refer_files

    for file in move_files:
        shutil.move(os.path.join(root_path, file), out_path)

if __name__ == '__main__' :
    Move_files("D:\\Dataset\\test1", "D:\\Dataset\\test2", "D:\\Dataset\\test3")
1 голос
/ 08 апреля 2020

Обновлено : Вы можете проверить, существует ли файл в другом каталоге, используя os.path.exists, а затем перемещать его, только если он еще не существует в /test2/:

if not os.path.exists(os.path.join(refer_path, file)):
    shutil.move(os.path.join(os.listdir(root_path, file)),os.path.join(os.listdir(refer_path, file)))

Кроме того, os.listdir принимает только один аргумент, путь к каталогу которого вы хотите перечислить файлы. Я думаю, что вы хотите изменить свое shutil.move утверждение на следующее: shutil.move(os.path.join(root_path, file),os.path.join(out_path, file))

...