получить полный путь, используя понимание списка в Python

1

могу ли я сделать что-то вроде этого (на самом деле это не работает)

flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]

спасибо!

  • 1
    Понимание двойного списка трудно читать и понимать. Вместо этого используйте петли, и ваши проблемы исчезнут.
Теги:
python-3.x

5 ответов

2
Лучший ответ

fnames пока не существует. Перемените петли.

flist = [dirpath + f for dirpath, dirnames, fnames in os.walk('/home/user') for f in fnames]
  • 0
    +1: я всегда получаю множественное число for s в понимании списка неправильно. И теперь я полностью их избегаю.
  • 0
    @Johnsyweb: Избегать их полностью - это, безусловно, правильное решение.
3

Лично я бы написал его как генератор:

def filetree(top):
    for dirpath, dirnames, fnames in os.walk(top):
        for fname in fnames:
            yield os.path.join(dirpath, fname)

Затем вы можете использовать его в цикле:

for name in filetree('/home/user'):
    do_something_with(name)

или переместите его в список:

flist = list(filetree('/home/user'))
1
flist = [os.path.join(pdir,f) for pdir, dirs, files in os.walk('/home/user') for f in files]

(os.path.join следует использовать вместо конкатенации строк для обработки OS- определенных разделителей и особенностей)

Однако, как уже отмечалось несколькими, понимание уровня списка multi- не очень читаемо и легко ошибиться.

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

flist = []
for root, dirs, files in os.walk(root_dir):
    flist.extend(os.path.join(root, f) for f in files)
    # to support python <2.4, use flist.extend([...])

Если вы просто используете flist в качестве промежуточного хранилища для итерации, вам может быть лучше использовать генератор, как показано в John answer.

0
path = '/home/user/'   # keep trailing '/'
flist = [path+name for name in os.listdir(path)]
0

Использование карты:

map(lambda data: map(lambda file: data[0] + '\\' + file, data[2]), os.walk('/home/user'))

ИЛИ

map(lambda data: map(lambda file: os.path.join(data[0], file), data[2]), os.walk('/home/user'))
  • 1
    data[0] + '\\' + file вместо os.path.join - довольно плохая идея.
  • 0
    Конечно, вы правы, это была просто идея, как использовать карту здесь, и добавление строк можно легко заменить на os.path.join.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню