Python 3 — Копировать файлы, если они не существуют в папке назначения

#python-3.x #shutil #os.path

#python-3.x #шутил #ос.путь #shutil #os.path

Вопрос:

Я пытаюсь переместить пару тысяч PDF-файлов из одного расположения файлов в другое. Исходная папка содержит несколько вложенных папок, и я объединяю только PDF-файлы (технические чертежи) в одну папку, чтобы упростить поиск остальной части моей команды.

Основная цель состоит в том, чтобы копировать только те файлы, которые еще не существуют в папке назначения. Я попробовал несколько разных вариантов, последний из которых показан ниже, и во всех случаях каждый файл копируется каждый раз. До сегодняшнего дня каждый раз, когда я пытался выполнить массовое перемещение файла, я получал сообщения об ошибках, если файл существовал в папке назначения, но я больше этого не делаю.

Я проверил, что некоторые файлы существуют в обоих местах, но все еще копируются. Есть ли что-то, чего я не хватает или что я могу изменить, чтобы исправить?

Спасибо за помощь.

 import os.path
import shutil

source_folder = os.path.abspath(r'\sourcefilelocation')

dest_folder = os.path.abspath(r'\destfolderlocation')

    for folder, subfolders, files in os.walk(source_folder):
        for file in files:
            path_file=os.path.join(folder, file)
            if os.path.exists(file) in os.walk(dest_folder):
                print(file " exists.")
            if not os.path.exists(file) in os.walk(dest_folder):
                  print(file ' does not exist.')
                  shutil.copy2(path_file, dest_folder)
  

Комментарии:

1. @DanielWalker Спасибо, что просмотрели это. Я думал if os.path.exists(file) in os.walk(dest_folder): , что проверял, существует ли файл в папке назначения, но из вашего вопроса похоже, что это неверно.

Ответ №1:

os.path.exists возвращает логическое значение. os.walk создает генератор, который создает тройки формы (dirpath, dirnames, filenames) . Итак, это первое условие никогда не будет истинным.

Кроме того, даже если это условие было правильным, ваше второе условие имеет избыточность, поскольку это просто отрицание первого. Вы могли бы заменить его на else .

То, что вы хотите, это что-то вроде

 if file in os.listdir(dest_folder):
    ...
else:
    ...
  

Комментарии:

1. Спасибо, Дэниел, это, кажется, прояснило ситуацию. Сначала я попробовал использовать Else и пытался объяснить ситуацию немного подробнее, чтобы посмотреть, смогу ли я найти, где была ошибка. Очевидно, что вы ищете не в том месте. Спасибо за помощь.