2011-08-17 22 views
49

Mi secuencia de comandos python ejecuta un os.listdir(path) donde la ruta es una cola que contiene archivos que debo tratar uno por uno.¿Cómo ignorar los archivos ocultos usando os.listdir()?

El problema es que estoy obteniendo la lista en una matriz y luego simplemente 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: ¿hay una función existente que ignore los archivos ocultos al ejecutar un os.listdir() y si no, cuál sería la mejor manera?

Gracias.

Respuesta

60

Puede escribir uno usted mismo:

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

O puede utilizar una glob:

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

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

+1

la función propuesta 'listdir_nohidden' no es del todo compatible con' os.listdir', ya que el uso de 'yield' lo convierte en un generador En su lugar, debe ejecutar la lista de salida de 'os.listdir' y eliminar las entradas que comienzan con '.' – 0sh

+1

@ 0sh: ¿Por qué tiene que eliminar cosas en el lugar? Simplemente defina una nueva función que haga 'list (listdir_nohidden (path))' y que la nueva función sea exactamente compatible con 'os.listdir'. – abarnert

10

glob:

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

(. glob dice que usa listdir y fnmatch bajo el capó, sino que también comprueba si hay un líder '.', no mediante el uso de fnmatch)

13

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 
+2

también debería funcionar en una Mac, los archivos ocultos comienzan allí con '.' también. –

+0

Esta es la única respuesta portable, gran trabajo, pero las otras respuestas proporcionan un contenedor completo para os.listdir así que ... '[f para f en os.listdir (ruta) si no es folder_is_hidden (f)]' – SensorSmith

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

Ésta es una cuestión de edad, pero parece que falta la respuesta obvia de usar lista por comprensión, por lo que estoy aquí para agregarlo exhaustividad:

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

Como nota al margen, los documentos del estado listdir proporcione resultados en 'orden arbitrario', sino un caso de uso común es tenerlos ordenados alfabéticamente. Si desea que el contenido del directorio ordenados alfabéticamente sin tomar en cuenta las mayúsculas, puede utilizar:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower()) 
0
filenames = (f.name for f in os.scandir() if not f.name.startswith('.')) 
Cuestiones relacionadas