#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("./"))