我的python脚本执行一个os.listdir(path)
路径,该路径是一个队列,其中包含我需要一一对待的档案。
问题是,我将列表放入数组中,然后执行一个简单的array.pop(0)
。直到我将项目置于颠覆状态之前,一切都很好。现在,我将.svn
文件夹保存在数组中,这当然会使应用程序崩溃。
所以这是我的问题:是否有一个函数在执行时会忽略隐藏文件os.listdir()
,如果不是,那是最好的方法?
Answers:
这是一个古老的问题,但似乎缺少使用列表理解的明显答案,因此为了完整性起见,我在此处添加它:
[f for f in os.listdir(path) if not f.startswith('.')]
附带说明一下,docs状态listdir
将以“任意顺序”返回结果,但常见的用例是按字母顺序对结果进行排序。如果希望目录内容按字母顺序排序而不考虑大小写,则可以使用:
sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
key=lambda f: f.lower()
:可以写不拉姆达key=str.lower
sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
在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
[f for f in os.listdir(path) if not folder_is_hidden(f)]
Joshmaker为您的问题提供了正确的解决方案。
如何使用os.listdir()忽略隐藏文件?
但是,在Python 3中,建议使用pathlib而不是os。
from pathlib import Path
visible_files = [
file for file in Path(".").iterdir() if not file.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提到的glob效果很好:
import glob
glob.glob('*')
.DS_Store
自动创建。当我压缩所有文件并将其推送到服务器时,.DS_Store
也会被添加。如果有各种隐藏文件,则可以尝试os.system('ls -1')
os.popen('ls -1').read()
在Windows上将无法使用。这就是重点os.listdir()
。
listdir_nohidden
与不太兼容os.listdir
,因为使用yield
使其成为生成器。相反,它应在输出列表中运行,os.listdir
并删除以“。”开头的条目。