Estoy tratando de obtener una lista de archivos en un directorio usando Python, pero no quiero una lista de TODOS los archivos.
Lo que esencialmente quiero es la capacidad de hacer algo como lo siguiente, pero usando Python y no ejecutando ls.
ls 145592*.jpg
Si no hay un método incorporado para esto, actualmente estoy pensando en escribir un bucle for para iterar a través de los resultados de un os.listdir()
y agregar todos los archivos coincidentes a una nueva lista.
Sin embargo, hay muchos archivos en ese directorio y, por lo tanto, espero que haya un método más eficiente (o un método incorporado).
python
filesystems
wildcard
glob
directory-listing
fantasma
fuente
fuente
Respuestas:
glob.glob('145592*.jpg')
fuente
glob.glob('145592*.jpg')
imprime toda la ruta absoluta de los archivos mientrasls 145592*.jpg
imprime solo la lista de archivos.glob()
solo usa listdir + fnmatch, en lugar de llamadas especiales del sistema operativo para hacer el filtrado de comodines. Por ejemplo, en Windows, laFindFirstFile
API le permite especificar comodines para que el sistema operativo realice el filtrado directamente, y presumiblemente de manera más eficiente (no creo que haya un equivalente en Linux).glob.glob()
Definitivamente es la forma de hacerlo (según Ignacio). Sin embargo, si necesita una correspondencia más complicada, puede hacerlo con una comprensión de la lista yre.match()
, algo así:Más flexible, pero como notas, menos eficiente.
fuente
[0-9]+
[0123456789]
secuencias ( ver documentos ), y también tiene lafnmatch.filter()
función que hace que este bucle sea un poco más eficiente.Mantenlo simple:
Prefiero esta forma de comprensión de listas porque se lee bien en inglés.
Leí la cuarta línea como: Por cada fn en os.listdir para mi ruta, dame solo las que coincidan con cualquiera de mis extensiones incluidas.
Puede ser difícil para los programadores principiantes de Python acostumbrarse realmente a usar las comprensiones de listas para el filtrado, y puede tener cierta sobrecarga de memoria para conjuntos de datos muy grandes, pero para enumerar un directorio y otras tareas simples de filtrado de cadenas, las comprensiones de listas conducen a una mayor limpieza código documentable
Lo único de este diseño es que no lo protege contra el error de pasar una cadena en lugar de una lista. Por ejemplo, si accidentalmente convierte una cadena en una lista y termina comprobando todos los caracteres de una cadena, podría terminar obteniendo una serie de falsos positivos.
Pero es mejor tener un problema fácil de solucionar que una solución difícil de entender.
fuente
any()
aquí, porquestr.endswith()
toma una secuencia de finales.if fn.endswith(included_extentensions)
Es más que suficiente.str.endswith(seq)
eso que Martijn señaló, esto no es correcto, porque un archivo tiene que terminar.ext
para que tenga esa extensión. Este código también encontrará (por ejemplo) un archivo llamado "myjpg" o un directorio llamado simplemente "png". Para solucionarlo, solo prefija cada extensiónincluded_extensions
con a.
.included_extensions
vsincluded_extentsions
? Una pena porque de lo contrario esta es mi respuesta preferida.Otra opción:
https://docs.python.org/3/library/fnmatch.html
fuente
glob
hace en una sola línea.glob
devuelve la ruta completa en lugar deos.listdir
simplemente devolver el nombre del archivo. Al menos esto es lo que está sucediendo en Python 2.Filtrar con
glob
módulo:Importar glob
Comodines:
Extensión de fiter
.txt
:Un solo personaje
Rangos de números
Rangos del alfabeto
fuente
Código preliminar
Solución 1 - use "glob"
Solución 2 - use "os" + "fnmatch"
Variante 2.1 - Búsqueda en el directorio actual
Variante 2.2 - Búsqueda recursiva
Resultado
Solución 3 - use "pathlib"
Notas:
fuente
use os.walk para enumerar recursivamente sus archivos
fuente
file.endswith(alist_filter)
es suficiente.Esto le dará una lista de archivos jpg con su ruta completa. Puede reemplazar
x[0]+"/"+f
conf
solo nombres de archivo. También puede reemplazarf.endswith(".jpg")
con cualquier condición de cadena que desee.fuente
También es posible que desee un enfoque de más alto nivel (lo he implementado y empaquetado como findtools ):
se puede instalar con
fuente
Nombres de archivo con extensiones "jpg" y "png" en "ruta / a / imágenes":
fuente
Puede usar pathlib que está disponible en la biblioteca estándar Python 3.4 y superior.
fuente
Puede definir un patrón y verificarlo. Aquí he tomado tanto el patrón inicial como el final y los busqué en el nombre del archivo. ARCHIVOS contiene la lista de todos los archivos en un directorio.
fuente
¿Qué tal str.split ()? Nada que importar.
fuente
f.endswith('.jpg')
(pero también seleccionaráfilename.jpg.ext
)Puede usar subprocess.check_ouput () como
Por supuesto, la cadena entre comillas puede ser cualquier cosa que desee ejecutar en el shell y almacenar la salida.
fuente
ls
No se debe analizar la salida de .