【发布时间】:2013-06-21 19:43:03
【问题描述】:
我可以做这样的事情吗(实际上它不起作用)
flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]
谢谢!
【问题讨论】:
-
双重列表理解很难阅读和理解。改用 for 循环,你的问题就会消失。
标签: python python-3.x
我可以做这样的事情吗(实际上它不起作用)
flist = [dirpath + f for f for fnames for dirpath, dirnames, fnames in os.walk('/home/user')]
谢谢!
【问题讨论】:
标签: python python-3.x
fnames 还不存在。交换循环。
flist = [dirpath + f for dirpath, dirnames, fnames in os.walk('/home/user') for f in fnames]
【讨论】:
fors。而现在我完全避开了它们。
我个人会把它写成生成器:
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 而不是字符串连接来处理特定于操作系统的分隔符和特性)
然而,正如一些人已经指出的那样,多级列表理解不是很易读,而且容易出错。
假设您确实希望将结果放在列表中:
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 中所示的生成器。
【讨论】:
使用地图:
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 是一个非常糟糕的主意。
path = '/home/user/' # keep trailing '/'
flist = [path+name for name in os.listdir(path)]
【讨论】: