我需要列出文件夹中包含目录路径的所有文件。我尝试使用os.walk
,这显然是完美的解决方案。
但是,它还列出了隐藏的文件夹和文件。我希望我的应用程序不要列出任何隐藏的文件夹或文件。是否有任何标志可用于使其不产生任何隐藏文件?
跨平台对我来说并不重要,只要它适用于linux(。* pattern)就可以了。
答案 0 :(得分:72)
不,os.walk()
没有选项可以跳过这些选项。你自己需要这样做(这很容易):
for root, dirs, files in os.walk(path):
files = [f for f in files if not f[0] == '.']
dirs[:] = [d for d in dirs if not d[0] == '.']
# use files and dirs
注意dirs[:] =
切片分配; os.walk
以递归方式遍历dirs
中列出的子目录。通过将dirs
的元素替换为满足条件的元素(例如,名称不以.
开头的目录),os.walk()
将不会访问目录不符合标准。
仅当您将topdown
关键字参数与documentation of os.walk()
保持True
时才有效:
当
topdown
为True
时,调用者可以就地修改dirnames列表(可能使用del
或切片分配),而walk()
只会递归到名称保留在 dirnames 中的子目录;这可用于修剪搜索,强制执行特定的访问顺序,甚至可以通知walk()
调用者在再次恢复walk()
之前创建或重命名的目录。
答案 1 :(得分:7)
我意识到这个问题没有被问到,但是我有一个类似的问题,我想要排除隐藏文件和以__
开头的文件,特别是__pycache__
目录。我找到了这个问题,因为我试图找出为什么我的列表理解不符合我的预期。我没有使用dirnames[:]
修改列表。
我创建了一个我想要排除的前缀列表,并修改了dirnames,如下所示:
exclude_prefixes = ('__', '.') # exclusion prefixes
for dirpath, dirnames, filenames in os.walk(node):
# exclude all dirs starting with exclude_prefixes
dirnames[:] = [dirname
for dirname in dirnames
if not dirname.startswith(exclude_prefixes)]
答案 2 :(得分:0)
我的用例与OP相似,只是我想返回某个文件夹内子目录总数的计数。就我而言,我想省略任何名为.git
的子目录(以及可能嵌套在这些.git
文件夹中的所有文件夹)。
在Python 3.6.7中,我发现接受的答案的方法不起作用-它计算了所有.git
文件夹及其子文件夹。这是对我有用的东西:
num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
if '.git' in dirs:
dirs.remove('.git')
num_local_subdir += (len(dirs))