2011-12-19 4 views
1

Я пытаюсь использовать питон os.walk для файлов из шарика произвольной структуры каталогов:Python: os.walk() поддерживать иерархию

matches = [] 
for root, dirnames, filenames in os.walk(path): 
    for filename in fnmatch.filter(filenames, name): 
     matches.append(os.path.join(root, filename)) 

print matches 

это красиво комками всех файлов, но я хотел бы также иметь возможность поддерживать фактическую структуру папок, то есть я хотел бы ходить в подпапку вложенной папке, поэтому я действительно знаю, какое имя файла принадлежит какой-либо подпапке. возможно ли это с os.walk или мне придется катить мою собственную функцию?

Чтобы уточнить мой вопрос: я хочу создать внутреннее дерево программы для каталогов, которые я анализирую, поэтому я бы хотел проанализировать дерево каталогов рекурсивным образом, чтобы я мог встретить каждый подкаталог и файл только один раз, т. Е. :

псевдокод:

def createAndParseSubDir(path): 
    ret = [] 
    files = glob(path) 
    for file in files: 
     if isDir(file): 
      ret.append(createAndParseSubDir(file)) 
     else: 
      ret.append(file) 

    return ret 

hierarchy = createAndParseSubDir(myRoot) 

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

+0

Принятый ответ на [этот вопрос] [1] решил эту проблему для меня. [1]: http://stackoverflow.com/questions/2909975/python-list-directory-subdirectory-and-files –

ответ

0

У вас уже есть эта информация, вы просто не использовать его:

for root, dirnames, filenames in os.walk(path): 
    # current folder: root 
    # list of filenames in that folder: filenames 
    # list of subdirectories in that folder: dirnames 
    for filename in fnmatch.filter(filenames, name): 
     matches.append(os.path.join(root, filename)) 
     #   current folder ----^  ^----- current file 
+0

Я знаю, что у меня есть имена папок, это больше о городе порядке. В основном я не только хочу пути, но хочу создать свое собственное дерево. – moka

0

Может быть, вы можете хранить в словаре вместо списка. Попробуйте это и посмотрите, соответствует ли он вашему счету.

matches = {} 
for root, dirnames, filenames in os.walk(path): 
    for filename in fnmatch.filter(filenames, name): 
     matches.setdefault(root,[]).append(os.path.join(root, filename)) 
Смежные вопросы