如何使用 os.listdir()忽略隐藏文件?

我的 python 脚本执行一个 os.listdir(path),其中的路径是一个包含归档的队列,我需要逐个处理这些归档。

问题是,我得到一个数组中的列表,然后我只做一个简单的 array.pop(0)。在我把项目置于颠覆之前,它一直运行良好。现在我得到了数组中的 .svn文件夹,当然它会使我的应用程序崩溃。

所以我的问题是: 在执行 os.listdir()时,有没有忽略隐藏文件的函数? 如果没有,那么什么是最好的方法?

123342 次浏览

地球仪 :

>>> import glob
>>> glob.glob('*')

(glob声称在引擎盖下使用 listdirfnmatch,但它也检查前导 '.',而不是使用 fnmatch。)

你可以自己写一个:

import os


def listdir_nohidden(path):
for f in os.listdir(path):
if not f.startswith('.'):
yield f

Or you can use a 一团:

import glob
import os


def listdir_nohidden(path):
return glob.glob(os.path.join(path, '*'))

其中任何一个都会忽略以 '.'开头的所有文件名。

在 Windows,Linux 和 OS X 上:

if os.name == 'nt':
import win32api, win32con




def folder_is_hidden(p):
if os.name== 'nt':
attribute = win32api.GetFileAttributes(p)
return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
else:
return p.startswith('.') #linux-osx

Joshmaker 对你的问题有正确的解决办法。
如何使用 os.listdir ()忽略隐藏文件?

但是,在 Python3中,建议使用 pathlib 而不是 os。

from pathlib import Path
visible_files = [
file for file in Path(".").iterdir() if not file.name.startswith(".")
]

这是一个老问题,但似乎没有使用列表内涵这个明显的答案,所以我在这里补充一下以便完整:

[f for f in os.listdir(path) if not f.startswith('.')]

顺便说一句,文档状态 listdir将以“任意顺序”返回结果,但一个常见的用例是按字母顺序排序。如果您希望目录内容按字母顺序排序而不是大写,您可以使用:

sorted((f for f in os.listdir() if not f.startswith(".")), key=str.lower)

(编辑后使用 key=str.lower而不是 lambda)

filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))

我认为在一个循环中遍历所有项目的工作量太大了。我更喜欢这样简单的东西:

lst = os.listdir(path)
if '.DS_Store' in lst:
lst.remove('.DS_Store')

如果该目录包含 多个隐藏文件,那么这可能有所帮助:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

正如@Josh 提到的 Globa 运行良好:

import glob
glob.glob('*')

You can just use a simple for loop that will exclude any file or directory that has "." in the front.

专业守则:

import os


directory_things = [i for i in os.listdir() if i[0] != "."] # Exclude all with . in the start

菜鸟的代号

items_in_directory = os.listdir()
final_items_in_directory = []


for i in items_in_directory:
if i[0] != ".": # If the item doesn't have any '.' in the start
final_items_in_directory.append(i)