2010-02-18 5 views
9

Je dispose d'un fichier texte avec des lignes comme ceci:lignes de tri dans un fichier texte, mais seulement utiliser les N premiers caractères

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 

Une sorte simple, échangerait les lignes 2 et 3 (bar est avant foo), mais Je voudrais garder les lignes (qui ont la même date/heure) dans leur ordre d'origine.

Comment puis-je faire cela en Python? Question supplémentaire: Le tri GNU peut-il également le faire?

+0

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

Répondre

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

Exemple:

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

Référence: http://docs.python.org/library/functions.html#sorted –

+0

Notez que cela trie la date/heure sous forme de chaîne. Cela arrive à travailler dans ce cas. Sinon, vous devrez peut-être utiliser une fonction de clé plus intelligente qui analyse la date et l'heure. –

4

Le tri intégré est stable, de sorte que vous les valeurs effectivement-mêmes pour rester par défaut.

import operator 

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

À ce stade sorted_lines sera une liste des lignes triées. Pour remplacer l'ancien fichier, créez un nouveau fichier, appelez new_file.writelines(sorted_lines), puis déplacez le nouveau fichier sur l'ancien.

+1

+1 pour expliquer que cela fonctionne car 'trié' est stable – fortran

+2

' s/tranche (24, aucun)/tranche (0, 24)/' – jfs

+0

@ J.F. Sebastian, Merci, j'ai mal lu la question (et je pensais que c'était en conflit avec le titre). De plus, votre regex a tort. ;) –

Questions connexes