【问题标题】:get full path name using list comprehension in python使用python中的列表理解获取完整路径名
【发布时间】: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


【解决方案1】:

fnames 还不存在。交换循环。

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

【讨论】:

  • +1:我总是在错误的列表理解中得到多个fors。而现在我完全避开了它们。
  • @Johnsyweb:完全避免它们绝对是正确的解决方案。
【解决方案2】:

我个人会把它写成生成器:

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'))

【讨论】:

    【解决方案3】:
    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 中所示的生成器。

    【讨论】:

      【解决方案4】:

      使用地图:

      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 是一个非常糟糕的主意。
      • 当然,你说得对,这里只是一个如何使用 map 的想法,字符串附加可以很容易地替换为 os.path.join。
      【解决方案5】:
      path = '/home/user/'   # keep trailing '/'
      flist = [path+name for name in os.listdir(path)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-16
        • 2013-07-17
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        相关资源
        最近更新 更多