使用python中的list comprehension获取完整路径名

时间:2011-06-08 12:01:19

标签: python python-3.x

我可以做这样的事情(实际上它不起作用)

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

谢谢!

5 个答案:

答案 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)]