我的 python 脚本执行一个os.listdir(path)
路径是一个队列,其中包含我需要一个一个处理的档案。
问题是我在数组中获取列表,然后我只做一个简单的array.pop(0)
. 在我将项目置于颠覆之前,它工作正常。现在我得到了.svn
我的数组中的文件夹,当然它会使我的应用程序崩溃。
所以这是我的问题:是否有一个函数在执行时忽略隐藏文件os.listdir()
,如果没有,最好的方法是什么?
我的 python 脚本执行一个os.listdir(path)
路径是一个队列,其中包含我需要一个一个处理的档案。
问题是我在数组中获取列表,然后我只做一个简单的array.pop(0)
. 在我将项目置于颠覆之前,它工作正常。现在我得到了.svn
我的数组中的文件夹,当然它会使我的应用程序崩溃。
所以这是我的问题:是否有一个函数在执行时忽略隐藏文件os.listdir()
,如果没有,最好的方法是什么?
你可以自己写一个:
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, '*'))
其中任何一个都将忽略所有以'.'
.
这是一个老问题,但似乎缺少使用列表理解的明显答案,所以为了完整起见,我在这里添加它:
[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
而不是 a lambda
)
在 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() 忽略隐藏文件?
然而,在 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('*')
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
您可以只使用一个简单的 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)