我可以做这样的事情(实际上它不起作用)
flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]
谢谢!
答案 0 :(得分: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 :(得分:2)
fnames
尚不存在。交换循环。
flist = [dirpath + f for dirpath, dirnames, fnames in os.walk('/home/user') for f in fnames]
答案 2 :(得分:1)
flist = [os.path.join(pdir,f) for pdir, dirs, files in os.walk('/home/user') for f in files]
(应使用os.path.join
代替字符串连接来处理特定于OS的分隔符和特性)
然而,正如几位已经指出的那样,多级列表理解不是很容易理解,也很容易出错。
假设您确实希望将结果列入清单:
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's answer中显示的生成器。
答案 3 :(得分:0)
使用地图:
map(lambda data: map(lambda file: data[0] + '\\' + file, data[2]), os.walk('/home/user'))
OR:
map(lambda data: map(lambda file: os.path.join(data[0], file), data[2]), os.walk('/home/user'))
答案 4 :(得分:0)
path = '/home/user/' # keep trailing '/'
flist = [path+name for name in os.listdir(path)]