python hidden-files

python - ¿Cómo ignorar los archivos ocultos usando os.listdir()?



hidden-files (7)

Creo que es demasiado trabajo revisar todos los elementos en un bucle. Yo preferiría algo más simple como esto:

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

Mi script python ejecuta un os.listdir(path) donde la ruta es una cola que contiene archivos que necesito tratar uno por uno.

El problema es que estoy obteniendo la lista en una matriz y luego hago una simple array.pop(0) . Funcionó bien hasta que puse el proyecto en subversión. Ahora obtengo la carpeta .svn en mi matriz y, por supuesto, bloquea mi aplicación.

Así que aquí está mi pregunta: ¿existe una función existente que ignore los archivos ocultos cuando se ejecuta un os.listdir() y si no, cuál sería la mejor manera?

Gracias.


En Windows, Linux y 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


Esta es una vieja pregunta, pero parece que falta la respuesta obvia de usar la comprensión de listas, así que la agrego aquí para completarla:

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

Como nota al margen, el listdir estado de documentos devolverá los resultados en ''orden arbitrario'', pero un caso de uso común es ordenarlos alfabéticamente. Si desea que los contenidos del directorio estén ordenados alfabéticamente sin consideración de mayúsculas, puede usar:

sorted([f for f in os.listdir(''./'')], key=lambda f: f.lower())


Puedes escribir uno tú mismo:

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

O puedes usar un glob :

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

Cualquiera de estos ignorará todos los nombres de archivo que comiencen con ''.'' .


glob :

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

( glob afirma usar listdir y fnmatch bajo el capó, pero también busca un ''.'' , no usando fnmatch ).


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


filter( lambda f: not f.startswith(''.''), os.listdir(''.''))