2013-05-02 3 views
1

Я использую os.walk(), чтобы проверить каталог для избыточных файлов и перечислить их. Псевдо-код выглядит примерно так:os.walk iteration not walking in Python

def checkPath(path): 
    do the for dirname, dirnames, filenames in os.walk(path) thing here... 

pathList = ["path1", "path2"] 

for each in pathList: 
    checkPath(each) 

Так это работает отлично первый пробегают, я получаю все, как и ожидалось, но на следующий os.walk на втором пути он просто пропускает прямо на счет .. . Нет ничего в dirname, dirnames, filenames. Я сделал некоторые заявления для печати, чтобы проверить все, и он входит в функцию, но ничего не делает для части os.walk().

перед тем, как сделать часть os.walk() функцией, чтобы определить, устранит ли она проблему, она была в петле цикла, соединенной с основным корпусом. Когда я попробовал (просто для удовольствия) очистить имя dirname, dirnames, filenames variables с del, на втором пути, когда пришла очистка, он сказал, что имя переменной dirname не существует ...

Так что, похоже, в функции или нет, последовательные итерации os.walk() arent populating ...

идеи?

Спасибо!

Чтобы добавить рабочий код в качестве примера, примерно так. Это действительно не имеет значения, что он делает, просто пытается получить os.walk ходить мульт пути:

import os 

def checkPath(path): 
    for dirname, dirnames, filenames in os.walk(path): 
     for filename in filenames: 
      print filename 

pathList = ["c:\temp\folder1", "c:\temp\folder2"] 

for path in pathList: 
    checkPath(path) 

print "done" 

Это может быть сделано таким образом (пытается увидеть, если вы звоните os.walk по-другому , как один из других комментаторов предположил, может помочь), или это может быть сделано рядный, что работает, очевидно ...

Еще раз спасибо всем,

+0

Каков путь, который он пропускает? – thegrinner

+4

Показать какой-то * рабочий код *, который демонстрирует вашу проблему ... – Bakuriu

+0

Пути простые, локальные папки тестовых данных (электронные таблицы, документы и т. Д.). pathList = ["c: \ temp \ folder1", "c: \ temp \ folder2"]. Каждая из этих папок имеет подпапки с несколькими файлами в них. В этом случае он обрабатывает первую папку, переходит во вторую папку, но os.walk, похоже, ничего не дает в именах файлов, dirnames, filenames variables ... – user1229108

ответ

2

os.walk возвращает генератор :-) http://wiki.python.org/moin/Generators

Обходным путем является несколько:

использовать список

1) LL = список (os.walk())

2) называть os.walk() каждый раз, когда

3) использовать itertools.chain

Код, который вы опубликовали, не должен иметь эту проблему (вы вызываете os.walk каждый раз), но это заставляет меня действительно думать об истощении генератора. Поэтому отправьте свой код, когда вы его написали [0]

[0] например, у вас есть какой-то предопределенный аргумент в вашей функции?

6

Ваш код работает для меня, если я использую фактические пути в своей системе, которые относятся к непустым каталогам.

Я подозреваю, что вы, возможно, есть проблема с линией ...

pathList = ["c:\temp\folder1", "c:\temp\folder2"] 

... так как \t и \f являются действительными управляющие последовательности.

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

pathList = ["c:\\temp\\folder1", "c:\\temp\\folder2"] 

... и если это не проблема, то это поможет привести настоящий код, который вы используете.

+0

Спасибо, но попробовал это. Он также не работает с необработанной строкой, r "c: \ temp \ folder1" – user1229108

+0

@ user1229108 Единственное, что я могу придумать, это то, что второй путь фактически не содержит файлов. – Aya

+0

Что касается размещения кода, это все, что я использую ... серьезно ... только эти несколько строк для проверки ходьбы по двум или более каталогам, и я не получаю ничего после первого. – user1229108

1

Вот рабочий пример

import os 

def checkPath(list_path): 
    for path in list_path: 
     for (path, dirs, files) in os.walk(path): 
      print len(files) 

checkPath(["F:/","F:/"]) 

See doc:

Генерировать имена файлов в дереве каталогов, идя по дереву либо сверху вниз или снизу вверх. Для каждого каталога в дереве, корневом в каталоге top (включая сам верх), он дает 3-кортежи (dirpath, dirnames, имена файлов).

EDIT:

, как указано в ваших ответах, os.walk() возвращает генератор. Генератор можно повторить только один раз. Это не структура, сохраняющая значения, но генерирующая значения «на лету», как она называется. Вот почему ваш второй цикл на os.walk(), у вас больше нет результатов. Вы можете спросить os.walk() каждый раз, когда вам это нужно, или сохранить os.walk() в истребитель.

+0

таким образом переформатирован и дал ему пробег. Я добавил инструкцию печати после «для пути в list_path:», чтобы напечатать имя пути. Для первого пути он печатает целые числа, указывающие количество файлов в каждой папке и вложенной папке. Это то, что я видел. Но когда он печатает, что он переходит к следующему пути, путь печатает, а затем заканчивается сценарий. Нет даже 0 сообщений о том, что он шел, но не получил никаких возвратов ... – user1229108

+0

это тоже работает для меня, протестировало его на 2 папки, добавив «путь печати» ниже первого цикла, чтобы убедиться. – keepitreall89