Tengo un archivo que puede estar en un lugar diferente en la máquina de cada usuario. ¿Hay alguna forma de implementar una búsqueda del archivo? ¿Una forma en la que puedo pasar el nombre del archivo y el árbol de directorios para buscar?
110
Respuestas:
os.walk es la respuesta, esta encontrará la primera coincidencia:
Y esto encontrará todas las coincidencias:
Y esto coincidirá con un patrón:
fuente
if name in file or name in dirs
for name in files:
fallará al buscarsuper-photo.jpg
cuando estésuper-photo.JPG
en el sistema de archivos. (una hora de mi vida que me gustaría recuperar ;-) La solución un poco desordenada esif str.lower(name) in [x.lower() for x in files]
Usé una versión de
os.walk
y en un directorio más grande, obtuve tiempos de alrededor de 3,5 segundos. Probé dos soluciones aleatorias sin gran mejora, luego lo hice:Si bien es solo POSIX, obtuve 0.25 seg.
A partir de esto, creo que es totalmente posible optimizar mucho la búsqueda completa de una manera independiente de la plataforma, pero aquí es donde detuve la investigación.
fuente
Si está usando Python en Ubuntu y solo quiere que funcione en Ubuntu de una manera sustancialmente más rápida, use el
locate
programa del terminal de esta manera.search_results
es unalist
de las rutas de archivo absolutas. Esto es 10,000 veces más rápido que los métodos anteriores y para una búsqueda que hice fue ~ 72,000 veces más rápido.fuente
En Python 3.4 o más reciente, puede usar pathlib para hacer globbing recursivo:
Referencia: https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob
En Python 3.5 o más reciente, también puede hacer globbing recursivo como este:
Referencia: https://docs.python.org/3/library/glob.html#glob.glob
fuente
Para una búsqueda rápida e independiente del sistema operativo, utilice
scandir
https://github.com/benhoyt/scandir/#readme
Lea http://bugs.python.org/issue11406 para obtener detalles sobre el motivo.
fuente
scandir.walk()
la respuesta de @ Nadia. Tenga en cuenta que si está utilizando Python 3.5+, yaos.walk()
tiene lasscandir.walk()
aceleraciones. Además, PEP 471 es probablemente un mejor documento para leer en busca de información que ese problema.Si está trabajando con Python 2, tiene un problema con la recursividad infinita en las ventanas causada por enlaces simbólicos autorreferentes.
Este script evitará seguir esos. Tenga en cuenta que esto es específico de Windows .
Devuelve una lista con todas las rutas que apuntan a archivos en la lista de nombres de archivo. Uso:
fuente
A continuación, usamos un argumento booleano "primer" para cambiar entre la primera coincidencia y todas las coincidencias (un valor predeterminado que es equivalente a "buscar archivo de nombre"):
fuente
La respuesta es muy similar a las existentes, pero ligeramente optimizada.
Para que pueda encontrar cualquier archivo o carpeta por patrón:
ya sea por subcadena:
o usando un predicado:
para buscar solo archivos o solo carpetas, reemplace "dirs + archivos", por ejemplo, con solo "dirs" o solo "archivos", según lo que necesite.
Saludos.
fuente
La respuesta de SARose funcionó para mí hasta que actualicé desde Ubuntu 20.04 LTS. El pequeño cambio que hice en su código lo hace funcionar en la última versión de Ubuntu.
fuente