могу ли я сделать что-то вроде этого (на самом деле это не работает)
flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]
спасибо!
fnames
пока не существует. Перемените петли.
flist = [dirpath + f for dirpath, dirnames, fnames in os.walk('/home/user') for f in fnames]
for
s в понимании списка неправильно. И теперь я полностью их избегаю.
Лично я бы написал его как генератор:
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'))
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.
path = '/home/user/' # keep trailing '/'
flist = [path+name for name in os.listdir(path)]
Использование карты:
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'))
data[0] + '\\' + file
вместо os.path.join
- довольно плохая идея.