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