Saltar al contenido

Leer archivos en un orden particular en python

Ya no tienes que indagar más por todo internet ya que has llegado al sitio perfecto, tenemos la respuesta que buscas sin problema.

Solución:

Los archivos en el sistema de archivos no están ordenados. Puede ordenar los nombres de archivo resultantes usted mismo usando el sorted() función:

for infile in sorted(glob.glob('*.txt')):
    print "Current File Being Processed is: " + infile

Tenga en cuenta que el os.path.join llamar a su código no es operativo; con un solo argumento no hace nada más que devolver ese argumento sin cambios.

Tenga en cuenta que sus archivos se clasificarán en orden alfabético, lo que pone 10 antes de 9. Puedes usar una personalizada key función para mejorar la clasificación:

import re
numbers = re.compile(r'(d+)')
def numericalSort(value):
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts

 for infile in sorted(glob.glob('*.txt'), key=numericalSort):
    print "Current File Being Processed is: " + infile

Él numericalSort La función divide cualquier dígito en un nombre de archivo, lo convierte en un número real y devuelve el resultado para ordenar:

>>> files = ['file9.txt', 'file10.txt', 'file11.txt', '32foo9.txt', '32foo10.txt']
>>> sorted(files)
['32foo10.txt', '32foo9.txt', 'file10.txt', 'file11.txt', 'file9.txt']
>>> sorted(files, key=numericalSort)
['32foo9.txt', '32foo10.txt', 'file9.txt', 'file10.txt', 'file11.txt']

Puedes envolver tu glob.glob( ... ) expresión dentro de un sorted( ... ) instrucción y ordene la lista resultante de archivos. Ejemplo:

for infile in sorted(glob.glob('*.txt')):

Puedes dar sorted una función de comparación o, mejor, utilizar el key= ... argumento para darle una costumbre key que se utiliza para clasificar.

Ejemplo:

Se encuentran los siguientes archivos:

x/blub01.txt
x/blub02.txt
x/blub10.txt
x/blub03.txt
y/blub05.txt

El siguiente código producirá la siguiente salida:

for filename in sorted(glob.glob('[xy]/*.txt')):
        print filename
# x/blub01.txt
# x/blub02.txt
# x/blub03.txt
# x/blub10.txt
# y/blub05.txt

Ahora con key función:

def key_func(x):
        return os.path.split(x)[-1]
for filename in sorted(glob.glob('[xy]/*.txt'), key=key_func):
        print filename
# x/blub01.txt
# x/blub02.txt
# x/blub03.txt
# y/blub05.txt
# x/blub10.txt

EDITAR:
Posiblemente esto key función puede ordenar sus archivos:

pat=re.compile("(d+)D*$")
...
def key_func(x):
        mat=pat.search(os.path.split(x)[-1]) # match last group of digits
        if mat is None:
            return x
        return ":>10".format(mat.group(1)) # right align to 10 digits.

Seguro que se puede mejorar, pero creo que entiendes el punto. Las rutas sin números se dejarán solas, las rutas con números se convertirán en un string que tiene 10 dígitos de ancho y contiene el número.

Nos encantaría que puedieras dar recomendación a este artículo si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *