Перебор отдельных файлов в os.walk в Python идиоматическим способом

Я начал с кода, полученного из другой вопрос stackoverflow для создания полных путей для всех файлов в дереве каталогов:

import os
def recursive_file_gen(mydir):
    for root, dirs, files in os.walk(mydir):
        for file in files:
            yield os.path.join(root, file)

Я хотел добавить запоминание, и мне казалось, что самый простой способ добиться этого — просто заставить recursive_file_gen вместо этого возвращать список:

def recursive_file_list(mydir):
    result = []
    for root, dirs, files in os.walk(mydir):
        for file in files:
            result.append(os.path.join(root, file))
    return result

Этот код хорош, на самом деле. Конечно, нетрудно понять, что происходит. Но составление списка с помощью последовательных операций append не совсем Pythonic. Я предполагаю, что есть лучший способ использовать синтаксис Python, возможно, через понимание списка, и изучение этого было бы поучительно.

Конечно, я мог бы написать:

def recursive_file_list(mydir):
    return list(recursive_file_gen(mydir))

и запомни это. Но мне интересно, есть ли что-нибудь чище.


person kuzzooroo    schedule 06.03.2014    source источник


Ответы (1)


Как насчет?

result = [os.path.join(root, file) for root, dir, files in os.walk(mydir) for file in files]
person juniper-    schedule 06.03.2014
comment
Да это оно! Я думаю, что в какой-то момент я пытался [os.path.join(root, file) for file in files for root, dir, files in os.walk(mydir)] (два предложения for в противоположном порядке), но это не сработало. Неправильный порядок оказывается опасным: после того, как я запустил ваш ответ (так что что-то связано с files), версия с неправильным порядком действительно запускается, но выдает мусор. - person kuzzooroo; 07.03.2014