Python: os.walk () поддерживает иерархию - PullRequest
1 голос
/ 19 декабря 2011

Я пытаюсь использовать pythons 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)

РЕДАКТИРОВАТЬ: В итоге я использовалпохожая рекурсивная функция, подобная приведенному выше псевдокоду, для обеспечения синтаксического анализа файлов / каталогов в древовидной форме.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2011

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

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))
0 голосов
/ 19 декабря 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...