Necesito iterar a través de todos los archivos .asm
dentro de un directorio determinado y hacer algunas acciones sobre ellos.¿Cómo puedo iterar sobre archivos en un directorio determinado?
¿Cómo se puede hacer esto de una manera eficiente?
Necesito iterar a través de todos los archivos .asm
dentro de un directorio determinado y hacer algunas acciones sobre ellos.¿Cómo puedo iterar sobre archivos en un directorio determinado?
¿Cómo se puede hacer esto de una manera eficiente?
Respuesta original:
for filename in os.listdir(directory):
if filename.endswith(".asm") or filename.endswith(".py"):
# print(os.path.join(directory, filename))
continue
else:
continue
Python versión 3.6 de la respuesta anterior, utilizando os
- asumiendo que tiene la ruta del directorio como un objeto str
en una variable llamada directory_in_str
:
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)
puede probar a usar glob módulo
import glob
for filename in glob.iglob('/foobar/*.asm'):
print('/foobar/%s' % filename)
Esto iterar sobre todos los archivos descendientes, no sólo 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)
Se encuentra una referencia para la función os.walk en lo siguiente: https://docs.python.org/2/library/os.path.html#os.path.walk – ScottMcC
Python 3.4 y posteriormente ofrecer pathlib en la biblioteca estándar. Se podría hacer:
from pathlib import Path
asm_pths = [pth for pth in Path.cwd().iterdir()
if pth.suffix == '.asm']
O si no te gusta las listas por comprensión:
asm_paths = []
for pth in Path.cwd().iterdir():
if pth.suffix == '.asm':
asm_pths.append(pth)
Path
objetos pueden ser fácilmente convertidos a cadenas.
No estoy del todo contento con esta implementación todavía, quería tener un constructor personalizado que haga DirectoryIndex._make(next(os.walk(input_path)))
de modo que solo pueda pasar la ruta para la que desea un listado 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)
Esto parece indicar los directorios o archivos inmediatamente debajo de un directorio. La respuesta por pedromateo a continuación parece hacer una lista recursiva. –
¡Buena respuesta! Puedo agregar que necesita importar el módulo "os" de Python con: - import os – Gabrer
Tenga en cuenta que en Python 3.6 el directorio se espera que esté en bytes y luego listdir escupirá una lista de nombres de archivos también en bytes. por lo que no puede ejecutar endswith directamente en él. Este bloque de código debe cambiarse a 'directorio = os.fsencode (directory_in_str) de archivo en os.listdir (directorio): (" asm") archivo = os.fsdecode (archivo) si filename.endswith o filename.endswith (". py"): # print (os.path.join (directorio, nombre de archivo)) continuar else: continuar' –