He escrito el siguiente código de Python:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, glob
path = '/home/my/path'
for infile in glob.glob( os.path.join(path, '*.png') ):
print infile
Ahora entiendo esto:
/home/my/path/output0352.png
/home/my/path/output0005.png
/home/my/path/output0137.png
/home/my/path/output0202.png
/home/my/path/output0023.png
/home/my/path/output0048.png
/home/my/path/output0069.png
/home/my/path/output0246.png
/home/my/path/output0071.png
/home/my/path/output0402.png
/home/my/path/output0230.png
/home/my/path/output0182.png
/home/my/path/output0121.png
/home/my/path/output0104.png
/home/my/path/output0219.png
/home/my/path/output0226.png
/home/my/path/output0215.png
/home/my/path/output0266.png
/home/my/path/output0347.png
/home/my/path/output0295.png
/home/my/path/output0131.png
/home/my/path/output0208.png
/home/my/path/output0194.png
¿De qué manera se ordena?
Podría ayudarlo a obtener mi salida ls -l:
-rw-r--r-- 1 moose moose 627669 2011-07-17 17:26 output0005.png
-rw-r--r-- 1 moose moose 596417 2011-07-17 17:26 output0023.png
-rw-r--r-- 1 moose moose 543639 2011-07-17 17:26 output0048.png
-rw-r--r-- 1 moose moose 535384 2011-07-17 17:27 output0069.png
-rw-r--r-- 1 moose moose 543216 2011-07-17 17:27 output0071.png
-rw-r--r-- 1 moose moose 561776 2011-07-17 17:27 output0104.png
-rw-r--r-- 1 moose moose 501865 2011-07-17 17:27 output0121.png
-rw-r--r-- 1 moose moose 547144 2011-07-17 17:27 output0131.png
-rw-r--r-- 1 moose moose 530596 2011-07-17 17:27 output0137.png
-rw-r--r-- 1 moose moose 532567 2011-07-17 17:27 output0182.png
-rw-r--r-- 1 moose moose 553562 2011-07-17 17:27 output0194.png
-rw-r--r-- 1 moose moose 574065 2011-07-17 17:27 output0202.png
-rw-r--r-- 1 moose moose 552197 2011-07-17 17:27 output0208.png
-rw-r--r-- 1 moose moose 559809 2011-07-17 17:27 output0215.png
-rw-r--r-- 1 moose moose 549046 2011-07-17 17:27 output0219.png
-rw-r--r-- 1 moose moose 566661 2011-07-17 17:27 output0226.png
-rw-r--r-- 1 moose moose 561678 2011-07-17 17:27 output0246.png
-rw-r--r-- 1 moose moose 525550 2011-07-17 17:27 output0266.png
-rw-r--r-- 1 moose moose 565715 2011-07-17 17:27 output0295.png
-rw-r--r-- 1 moose moose 568381 2011-07-17 17:28 output0347.png
-rw-r--r-- 1 moose moose 532768 2011-07-17 17:28 output0352.png
-rw-r--r-- 1 moose moose 535818 2011-07-17 17:28 output0402.png
No está ordenado por nombre de archivo o tamaño.
ls
comando en sí clasifica los archivos por nombre. 'ls -U' proporciona una lista desordenada de archivos en "orden de directorio".os.listdir
: * nix OS devuelve los archivos en un orden bastante no alfabético, y (¡qué pena que me sorprendan!) Esto está explícito en la documentación : "La lista está en orden arbitrario".Respuestas:
Probablemente no esté ordenado en absoluto y utiliza el orden en que aparecen las entradas en el sistema de archivos, es decir, el que se obtiene al usar
ls -U
. (Al menos en mi máquina, esto produce el mismo orden que enumerarglob
coincidencias).fuente
El orden es arbitrario, pero puede ordenarlos usted mismo
Si quieres ordenar por nombre:
ordenado por hora de modificación:
ordenado por tamaño:
etc.
fuente
files = glob.glob('teksty/*')
. ¿Se otorgará el pedido por nam?Al verificar el código fuente
glob.glob
, verá que llama internamenteos.listdir
, como se describe aquí:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
Oración clave: os.listdir (ruta) Devuelve una lista que contiene los nombres de las entradas en el directorio dado por ruta. La lista está en orden arbitrario. No incluye las entradas especiales '.' y '...' incluso si están presentes en el directorio.
Orden arbitrario . :)
fuente
glob.glob () es un contenedor alrededor de os.listdir (), por lo que el sistema operativo subyacente se encarga de entregar los datos. En general: no puede hacer una suposición sobre el pedido aquí. La suposición básica es: sin ordenar. Si necesita algún tipo de clasificación: ordene en el nivel de la aplicación.
fuente
El orden es arbitrario, pero hay varias formas de ordenarlos. Uno de ellos es el siguiente:
fuente
natsort
:from natsort import natsorted; files = natsorted(files)
.Tuve un problema similar,
glob
estaba devolviendo una lista de nombres de archivo en un orden arbitrario, pero quería revisarlos en orden numérico como lo indica el nombre del archivo. Así es como lo logré:Mis archivos fueron devueltos por
glob
algo como:Ordene la lista en su lugar, para hacer esto creé una función:
Esta función devuelve la parte numérica del nombre del archivo y la convierte en un entero. Luego llamé al método de clasificación en la lista como tal:
Esto devolvió una lista como tal:
fuente
os.path.splitext(os.path.basename(s))[0]
lugar deos.path.basename(s)[:-4]
, por lo que la definición de la función será.def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
Si se pregunta qué ha hecho glob.glob en su sistema en el pasado y no puede agregar una
sorted
llamada, el orden será consistente en los sistemas de archivos Mac HFS + y será un orden transversal en otros sistemas Unix. Por lo tanto, es probable que haya sido determinista a menos que se haya reorganizado el sistema de archivos subyacente, lo que puede suceder si se agregan, eliminan, renombran, eliminan, mueven, etc.fuente
De la solución de @Johan La Rooy, ordenar las imágenes usando
sorted(glob.glob('*.png'))
no funciona para mí, la lista de salida todavía no está ordenada por sus nombres.Sin embargo,
sorted(glob.glob('*.png'), key=os.path.getmtime)
funciona perfectamente.Estoy un poco confundido sobre cómo la clasificación por sus nombres no funciona aquí.
Agradezca a @ Martin Thoma por publicar esta gran pregunta y a @Johan La Rooy por las soluciones útiles.
fuente
Por favor intente este código:
fuente
Así es como hice mi caso particular. Espero que sea útil.
fuente