¿Cómo puedo iterar sobre archivos en un directorio dado?

Necesito recorrer todos los archivos .asm dentro de un directorio determinado y realizar algunas acciones en ellos.

¿Cómo se puede hacer esto de una manera eficiente?

Respuesta original:

 import os for filename in os.listdir(directory): if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue 

Versión de Python 3.6 de la respuesta anterior, usando os – asumiendo que tiene la ruta del directorio como un objeto str en una variable llamada directory_in_str :

 import os directory = os.fsencode(directory_in_str) for file in os.listdir(directory): filename = os.fsdecode(file) if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue 

O recursivamente, usando pathlib :

 from pathlib import Path pathlist = Path(directory_in_str).glob('**/*.asm') for path in pathlist: # because path is object not string path_in_str = str(path) # print(path_in_str) 

Esto recorrerá todos los archivos descendientes, no solo los hijos inmediatos del directorio:

 import os for subdir, dirs, files in os.walk(rootdir): for file in files: #print os.path.join(subdir, file) filepath = subdir + os.sep + file if filepath.endswith(".asm"): print (filepath) 

Puedes intentar usar el módulo glob :

 import glob for filepath in glob.iglob('my_dir/*.asm'): print(filepath) 

y desde Python 3.5 también puedes buscar subdirectorios:

 glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt'] 

De los documentos:

El módulo glob encuentra todos los nombres de ruta que coinciden con un patrón específico de acuerdo con las reglas utilizadas por el shell de Unix, aunque los resultados se devuelven en orden arbitrario. No se realiza la expansión de tilde, pero los rangos de caracteres *,? Y expresados ​​con [] coincidirán correctamente.

Python 3.4 y versiones posteriores ofrecen pathlib en la biblioteca estándar. Podrías hacerlo:

 from pathlib import Path asm_pths = [pth for pth in Path.cwd().iterdir() if pth.suffix == '.asm'] 

O si no te gustan las listas de comprensión:

 asm_paths = [] for pth in Path.cwd().iterdir(): if pth.suffix == '.asm': asm_pths.append(pth) 

Path objetos de Path se pueden convertir fácilmente en cadenas.

Así es como itero a través de archivos en Python:

 import os path = 'the/name/of/your/path' folder = os.fsencode(path) filenames = [] for file in os.listdir(folder): filename = os.fsdecode(file) if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using... filenames.append(filename) filenames.sort() # now you have the filenames and can do something with them 

NINGUNA DE ESTAS TÉCNICAS GARANTIZAN CUALQUIER ORDEN DE ITERACIÓN

Sí, super impredecible. Observe que ordeno los nombres de los archivos, lo cual es importante si el orden de los archivos es importante, es decir, para los cuadros de video o la recostackción de datos dependiente del tiempo. ¡Asegúrate de poner índices en tus nombres de archivo!

Todavía no estoy del todo contento con esta implementación. Quería tener un constructor personalizado que DirectoryIndex._make(next(os.walk(input_path))) para que solo pueda pasar la ruta por la que desea una lista de archivos. Ediciones bienvenidas!

 import collections import os DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files']) for file_name in DirectoryIndex(*next(os.walk('.'))).files: file_path = os.path.join(path, file_name)