如何使用 os.listdir() 忽略隐藏文件?
- 2025-04-16 08:56:00
- admin 原创
- 15
问题描述:
我的 python 脚本执行其中os.listdir(path)
路径是一个队列,其中包含我需要逐个处理的档案。
问题是,我把列表放到数组里,然后做了一个简单的操作array.pop(0)
。在我把项目放到 Subversion 里之前,一切都运行正常。现在,我把.svn
文件夹放到数组里,结果导致我的应用程序崩溃。
所以我的问题是:是否存在一个在执行时忽略隐藏文件的函数os.listdir()
,如果没有,最好的方法是什么?
解决方案 1:
你可以自己写一个:
import os
def listdir_nohidden(path):
for f in os.listdir(path):
if not f.startswith('.'):
yield f
或者你可以使用glob:
import glob
import os
def listdir_nohidden(path):
return glob.glob(os.path.join(path, '*'))
上述任何一个命令都会忽略所有以 开头的文件名'.'
。
解决方案 2:
这是一个老问题,但似乎缺少使用列表理解的明显答案,因此为了完整性我在这里添加它:
[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
)
解决方案 3:
在 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
解决方案 4:
Joshmaker 对你的问题给出了正确的解决方案。
如何使用 os.listdir() 忽略隐藏文件?
但是在 Python 3 中,建议使用 pathlib 而不是 os。
from pathlib import Path
visible_files = [
file for file in Path(".").iterdir() if not file.name.startswith(".")
]
解决方案 5:
全局:
>>> import glob
>>> glob.glob('*')
(声称在底层glob
使用listdir
和,但它还检查前导,而不是使用。)fnmatch
`'.'`fnmatch
解决方案 6:
我觉得循环遍历所有条目太麻烦了。我更喜欢像这样更简单的方法:
lst = os.listdir(path)
if '.DS_Store' in lst:
lst.remove('.DS_Store')
如果目录包含多个隐藏文件,那么这可能会有所帮助:
all_files = os.popen('ls -1').read()
lst = all_files.split('
')
对于平台独立性,正如@Josh提到的,glob 效果很好:
import glob
glob.glob('*')
解决方案 7:
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
解决方案 8:
您只需使用一个简单的 for 循环即可排除任何以“.”开头的文件或目录。
专业人士守则:
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)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD