sort lista code backwards ascending python file order

lista - sort python 3 reverse



Leyendo archivos en un orden particular en python (5)

Digamos que tengo tres archivos en una carpeta: file9.txt, file10.txt y file11.txt y quiero leerlos en este orden particular. Puede alguien ayudarme con esto?

Ahora mismo estoy usando el código

import glob, os for infile in glob.glob(os.path.join( ''*.txt'')): print "Current File Being Processed is: " + infile

y lee primero file10.txt, luego file11.txt y luego file9.txt.

¿Puede alguien ayudarme a obtener el pedido correcto?


Debe cambiar el orden de "ASCIIBetical" a numérico aislando el número en el nombre del archivo. Puedes hacerlo así:

import re def keyFunc(afilename): nondigits = re.compile("/D") return int(nondigits.sub("", afilename)) filenames = ["file10.txt", "file11.txt", "file9.txt"] for x in sorted(filenames, key=keyFunc): print xcode here

Donde puede establecer nombres de archivos con el resultado de glob.glob ("*. Txt");

Además, la función keyFunc supone que el nombre de archivo tendrá un número y que el número solo está en el nombre de archivo. Puede cambiar esa función para que sea tan compleja como necesite para aislar el número que necesita ordenar.


Los archivos en el sistema de archivos no están ordenados. Puede ordenar los nombres de los archivos resultantes utilizando la función sorted() :

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

Tenga en cuenta que la llamada os.path.join en su código es un no-op; con un solo argumento, no hace nada más que devolver ese argumento sin alteraciones.

Tenga en cuenta que sus archivos se ordenarán en orden alfabético, lo que pone 10 antes de 9 . Puede utilizar una función de tecla personalizada 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

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

>>> 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'']


Puede envolver su glob.glob( ... ) dentro de una declaración sorted( ... ) y ordenar la lista resultante de archivos. Ejemplo:

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

Puede sorted una función de comparación sorted o, mejor, usar el argumento key= ... para darle una clave personalizada que se utiliza para la clasificación.

Ejemplo:

Hay los siguientes archivos:

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

El siguiente código producirá el siguiente resultado:

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 función clave:

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 esta función clave 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 una cadena que tiene 10 dígitos de ancho y contiene el número.


for fname in [''file9.txt'',''file10.txt'',''file11.txt'']: with open(fname) as f: # default open mode is for reading for line in f: # do something with line


glob.glob(os.path.join( ''*.txt''))

devuelve una lista de cadenas, por lo que puede ordenar fácilmente la lista usando la función ordenada () de pythons.

sorted(glob.glob(os.path.join( ''*.txt'')))