Этот ответ имеет целью расширить / уточнить, что выражали другие ответы. Решение обязательно будет варьироваться в зависимости от того, что точно вы хотите достичь.
Если вы хотите повторять один и тот же результат os.walk
несколько раз, вам нужно будет инициализировать список из элементов os.walk
iterable (т.е. walk = list(os.walk(path))
).
Если вы должны гарантировать, что данные остаются прежними, это, вероятно, ваш единственный вариант. Однако есть несколько сценариев, в которых это невозможно или нежелательно.
- Невозможно выполнить итерацию
list()
, если вывод имеет достаточный размер (т. Е. Попытка list()
всей файловой системы может заморозить ваш компьютер).
- нежелательно
list()
повторять, если вы хотите получать «свежие» данные перед каждым использованием.
В случае, если list()
не подходит, вам нужно будет запустить генератор по требованию. Обратите внимание, что генераторы гаснут после каждого использования, поэтому это создает небольшую проблему. Чтобы «перезапустить» ваш генератор несколько раз, вы можете использовать следующий шаблон:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
class WalkMaker:
def __init__(self, path):
self.path = path
def __iter__(self):
for root, dirs, files in os.walk(self.path):
for pathname in dirs + files:
yield os.path.join(root, pathname)
walk = WalkMaker('/home')
for path in walk:
pass
# do something...
for path in walk:
pass
Вышеупомянутый шаблон дизайна позволит вам сохранить ваш код СУХИМ.