Python - 以递归方式创建给定目录中的文件列表

时间:2017-11-23 23:58:46

标签: python linux python-3.x unix os.path

我遇到的问题应该很简单 -  从给定目录路径中的文件创建列表。我怀疑这个问题与相对路径有关,但仍然无法让它正常工作。这是一个起点:

 import sys, os.path

 dir = os.path.abspath(sys.argv[1])
 print(f'Given directory path: {dir}')

 filelist = []
 [filelist.append(os.path.abspath(item)) for item in os.listdir(dir)
     if os.path.isfile(item) if not item.startswith('.')]

 for file in filelist:
     print(file)
  • 仅限文件。没有子目录添加到列表中。
  • 列表条目应包含文件的完整路径名。
  • 非递归的。只有给定文件夹中的文件。
  • 跳过隐藏文件。
  • 使用os.walk(递归)和删除列表条目被认为是一个hacky解决方案。

更新

这个问题与os.listdir和相对路径有关,而我的笨拙列表理解不必要地增加了组合的复杂性。修复评论中建议的列表理解使得将它们放在一起变得更加清晰和容易,并且它现在可以正常工作。下面的工作代码:

filelist = [os.path.join(os.path.abspath(dir),file)
            for file in os.listdir(dir)
            if os.path.isfile(os.path.join(dir,file))
            if not file.startswith('.')]

更新2:从我的自我强加的列表理解监狱中解脱出来,我意识到也可以使用next和os.walk:

filelist = [os.path.join(dir,file)
            for file in next(os.walk(dir))[2]
            if not file.startswith('.')]

2 个答案:

答案 0 :(得分:0)

我认为glob会排除隐藏文件。这应该为您提供所提供路径的文件列表。

from os.path import abspath, isfile, join
from  glob import glob

files = [abspath(x) for x in glob(join(sys.argv[1], '*')) if isfile(x)]

答案 1 :(得分:0)

问题是os.path.abspath(item),其中item在dir中,必须假定该项在当前工作目录中,因为os.listdir只返回相对于dir参数的对象。而是使用 os.path.abspath(os.path.join(dir,item))或者只是os.path.join(dir,item)