Estoy trabajando en un script para recorrer de forma recursiva subcarpetas en una carpeta principal y crear una lista a partir de un determinado tipo de archivo. Tengo un problema con el guión. Actualmente está configurado de la siguiente manera
for root, subFolder, files in os.walk(PATH):
for item in files:
if item.endswith(".txt") :
fileNamePath = str(os.path.join(root,subFolder,item))
el problema es que la variable subcarpeta extrae una lista de subcarpetas en lugar de la carpeta en la que se encuentra el archivo ITEM. Estaba pensando en ejecutar un bucle for para la subcarpeta antes y unirme a la primera parte de la ruta, pero pensé que volvería a verificar si alguien tiene alguna sugerencia antes de eso. ¡Gracias por tu ayuda!
rglob
es insensible en las plataformas de Windows, pero no es portátilmente insensible.glob
(Python 3.6 aquí):glob.iglob(os.path.join(real_source_path, '**', '*.[xX][mM][lL]')
iglob
no funciona para archivos en sub-subcarpetas o debajo. Necesitas agregarrecursive=True
.glob.glob()
obtuvo un nuevo parámetro recursivo .Si desea obtener todos los
.txt
archivos debajomy_path
(recursivamente incluidos los subdirectorios):Si necesita un iterador, puede usar iglob como alternativa:
fuente
files = glob.glob(PATH + '/*/**/*.txt', recursive=True)
?Traduciré la lista de comprensión de John La Rooy a los for anidados, en caso de que alguien más tenga problemas para entenderla.
Debería ser equivalente a:
Aquí está la documentación para la comprensión de listas y las funciones os.walk y glob.glob .
fuente
glob.glob(..., recursive=True)
ylist(Path(dir).glob(...'))
no lo hizo.Esta parece ser la solución más rápida que pude llegar a, y es más rápido que
os.walk
y mucho más rápido que cualquierglob
solución .f.path
af.name
(¡no lo cambie para las subcarpetas!).Args:
dir: str, ext: list
.La función devuelve dos listas:
subfolders, files
.Consulte a continuación para obtener un análisis detallado de la velocidad.
Análisis de velocidad
para varios métodos para obtener todos los archivos con una extensión de archivo específica dentro de todas las subcarpetas y la carpeta principal.
tl; dr:
-
fast_scandir
claramente gana y es dos veces más rápido que todas las demás soluciones, excepto os.walk.-
os.walk
es el segundo lugar un poco más lento.- El uso
glob
ralentizará enormemente el proceso.- Ninguno de los resultados utiliza clasificación natural . Esto significa que los resultados se ordenarán así: 1, 10, 2. Para obtener una clasificación natural (1, 2, 10), consulte https://stackoverflow.com/a/48030307/2441026
Resultados:
Las pruebas se realizaron con W7x64, Python 3.8.1, 20 ejecuciones. 16596 archivos en 439 subcarpetas (parcialmente anidadas).
find_files
es de https://stackoverflow.com/a/45646357/2441026 y le permite buscar varias extensiones.fast_scandir
fue escrito por mí mismo y también devolverá una lista de subcarpetas. Puede darle una lista de extensiones para buscar (probé una lista con una entrada a una simpleif ... == ".jpg"
y no hubo una diferencia significativa).fuente
La nueva
pathlib
biblioteca simplifica esto a una línea:También puede utilizar la versión del generador:
Esto devuelve
Path
objetos, que puede usar para casi cualquier cosa, u obtener el nombre del archivo como una cadenafile.name
.fuente
No es la respuesta más pitónica, pero la pondré aquí por diversión porque es una buena lección de recursividad.
En mi máquina tengo dos carpetas
root
yroot2
Digamos que quiero encontrar todos
.txt
y cada uno de los.mid
archivos en cualquiera de estos directorios, luego puedo hacerfuente
El recursivo es nuevo en Python 3.5, por lo que no funcionará en Python 2.7. Aquí está el ejemplo que usa
r
cadenas, por lo que solo necesita proporcionar la ruta tal como está en Win, Lin, ...Nota: Enumerará todos los archivos, sin importar qué tan profundo sea.
fuente
Puede hacerlo de esta manera para devolverle una lista de archivos de ruta absoluta.
fuente
Si no le importa instalar una biblioteca de luces adicional, puede hacer esto:
Uso:
El resultado debería verse así:
Funciona tanto en Python 2.7 como en Python 3.
Github: https://github.com/kyzas/plazy#list-files
Descargo de responsabilidad: soy autor de
plazy
.fuente
Esta función colocará recursivamente solo archivos en una lista. Espero que esto te sirva.
fuente
Su solución original era casi correcta, pero la variable "raíz" se actualiza dinámicamente a medida que recorre de forma recursiva. os.walk () es un generador recursivo. Cada conjunto de tuplas de (raíz, subcarpeta, archivos) es para una raíz específica según la configuración.
es decir
Hice una pequeña modificación en su código para imprimir una lista completa.
¡Espero que esto ayude!
fuente