español - ¿Cómo se ordena Pythons glob.glob?




descargar lenguaje (6)

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 está ordenado?

Puede ayudarte 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.

Otros enlaces: glob , ls


Answers

Probablemente no esté ordenado en absoluto y utiliza el orden en el que aparecen las entradas en el sistema de archivos, es decir, el que obtiene al usar ls -U . (Al menos en mi máquina, esto produce el mismo orden que el listado de las glob ).


Al verificar el código fuente de glob.glob , verá que internamente llama a os.listdir , que se describe aquí:

http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir

Frase clave: os.listdir (ruta) Devuelve una lista que contiene los nombres de las entradas en el directorio indicado por la ruta. La lista está en orden arbitrario. No incluye las entradas especiales '.' y '..' incluso si están presentes en el directorio.

Orden arbitraria :)


El orden es arbitrario, pero puede ordenarlos usted mismo

Si quieres ordenar por nombre:

sorted(glob.glob('*.png'))

ordenados por tiempo de modificación:

import os
sorted(glob.glob('*.png'), key=os.path.getmtime)

ordenados por tamaño:

import os
sorted(glob.glob('*.png'), key=os.path.getsize)

etc.


Tenía un problema similar, glob devolvía una lista de nombres de archivos en un orden arbitrario, pero quería pasar por ellos en orden numérico como lo indica el nombre del archivo. Así es como lo logré:

Mis archivos fueron devueltos por glob algo así como:

myList = ["c:\tmp\x\123.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\12.csv"]

Ordene la lista en su lugar, para hacer esto creé una función:

def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])

Esta función devuelve la parte numérica del nombre del archivo y se convierte en un entero. Luego llamé al método de clasificación en la lista como tal:

myList.sort(key=sortKeyFunc)

Esto devolvió una lista como tal:

["c:\tmp\x\12.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\123.csv"]

glob.glob () es un contenedor alrededor de os.listdir () por lo que el SO subyacente está a cargo de la entrega de los datos. En general: no puede hacer una suposición sobre el orden aquí. La suposición básica es: no ordenar. Si necesita alguna clasificación: ordenar en el nivel de la aplicación.


Aparte de todas las respuestas dadas, me gustaría agregar algunos puntos:

1) __repr__() se invoca cuando simplemente escribe el nombre del objeto en la consola interactiva de Python y presiona enter.

2) __str__() se invoca cuando utiliza el objeto con la declaración de impresión.

3) En caso de que falte __str__ , imprima y cualquier función que use str() invoca a __repr__() del objeto.

4) __str__() de contenedores, cuando se invoca ejecutará el __repr__() de sus elementos contenidos.

5) str() llamado dentro de __str__() potencialmente podría recuperarse sin un caso base, y error en la profundidad máxima de recursión.

6) __repr__() puede llamar a repr() que intentará evitar la recursión infinita automáticamente, reemplazando un objeto ya representado con ...





python