2010-02-18 8 views
9

que tengo un archivo de texto con las líneas de la siguiente manera:líneas de clasificación en archivo de texto, pero sólo usar los primeros N caracteres

2010-02-18 11:46:46.1287 bla 
2010-02-18 11:46:46.1333 foo 
2010-02-18 11:46:46.1333 bar 
2010-02-18 11:46:46.1467 bla 

Un tipo simple sería intercambiar las líneas 2 y 3 (barra viene antes foo), pero Me gustaría mantener las líneas (que tienen la misma fecha/hora) en su orden original.

¿Cómo puedo hacer esto en Python?

Pregunta adicional: ¿Puede GNU ordenar también hacer esto?

+0

'ordenar -s -k 1,2 data.txt' – jfs

Respuesta

24
sorted(array, key=lambda x:x[:24]) 

Ejemplo:

>>> a = ["wxyz", "abce", "abcd", "bcde"] 
>>> sorted(a) 
['abcd', 'abce', 'bcde', 'wxyz'] 
>>> sorted(a, key=lambda x:x[:3]) 
['abce', 'abcd', 'bcde', 'wxyz'] 
+4

Referencia: http://docs.python.org/library/functions.html#sorted –

+0

Tenga en cuenta que esto ordena la fecha/hora como una cadena. Eso funciona en este caso. De lo contrario, es posible que necesite utilizar una función de clave más inteligente que realmente analiza la fecha/hora. –

4

El incorporada en la especie es estable, por lo que los valores de igual manera eficaz estancia en orden por defecto.

import operator 

with open('filename', 'r') as f: 
    sorted_lines = sorted(f, key=operator.itemgetter(slice(0, 24))) 

En este punto sorted_lines habrá una lista de las líneas ordenados. Para reemplazar el archivo anterior, cree un nuevo archivo, llame al new_file.writelines(sorted_lines), luego mueva el nuevo archivo sobre el anterior.

+1

+1 para explicar que funciona porque 'ordenado' es estable – fortran

+2

' s/slice (24, None)/slice (0, 24)/' – jfs

+0

@ J.F. Sebastian, gracias, leí mal la pregunta (y pensé que estaba en conflicto con el título). Además, tu expresión regular es incorrecta. ;) –

Cuestiones relacionadas