Возникли проблемы с циклом через os.walk (./)

#python #operating-system

#python #операционная система

Вопрос:

Я пытаюсь создать скрипт, который перебирает текущий каталог и проверяет каждый файл на наличие клона (копии того же файла). Вот код:

 import os
import filecmp

scan_result = os.walk("./")
checked_files = []

for parent, dirs, files in scan_result:
    for file in files:
        file = parent   "\"   file
        checked_files.append(file)

        for par, d, f in scan_result:
            for fi in f:
                data = par   "\"   fi 

                if data not in checked_files:
                    result = filecmp.cmp(file, data)
                    print(f"Comparing {file} with {data}")

                    if result:
                        print(f"Dupe Found for {file} and {data}")
                    else:
                        print(f"No luck for the file {file} with {data}")
  

Но всякий раз, когда я запускаю код, скрипт проверяет только один файл в той же папке, фактически не заходя в какие-либо другие каталоги, и внезапно заканчивается. Любое решение для этого. Спасибо.

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

1. Почему вы снова scan_result повторяете цикл внутри основного цикла, где вы уже повторяете его?

2. @JohnGordon Я делаю это, чтобы я мог видеть, есть ли у файла какая-либо форма клонирования внутри его подкаталогов

3. os.walk является генератором. Его нельзя повторить несколько раз. Поскольку вы пытаетесь выполнить итерацию по нему в 2 разных циклах, он не обрабатывает все результаты должным образом

4. @rdas О, я совсем забыл, что это объект генератора, есть ли какие-либо обходные пути для этого

5. scan_result = list(os.walk('./'))

Ответ №1:

Я благодарю @rdas за ответ на этот вопрос в комментариях. os.walk() возвращает объект генератора, поэтому, когда я попытался дважды выполнить итерацию по этому объекту в одном и том же коде, итератор полностью пропускает все каталоги. Простое решение этой проблемы — просто заменить эту строку кода

 scan_result = os.walk("./")
  

с

 scan_result = list(os.walk("./"))