rutas - recorrer directorios en python
¿Cómo puedo iterar sobre archivos en un directorio dado? (6)
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. Tenga en cuenta 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 recopilación de datos dependiente del tiempo. ¡Asegúrate de poner índices en tus nombres de archivo!
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?
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)
Python 3.4 y pathlib 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.
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
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
:
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)
Todavía no estoy muy 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 para 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)