按多列对文本文件进行排序

时间:2014-04-14 01:10:47

标签: python file csv

我有一个大约有10列的文本文件,其中7列是日期/时间戳(年,月,日,小时,分钟,秒,厘米)。所以数据看起来大致像......

User[TAB]System[TAB]Year[TAB]Month[TAB]Day ... centisec[TAB]Message

抱歉可怕的格式化,但我希望这能给你提供这个想法。

因此,如果我想按年划分文件,我可以使用此

sorted_lines = sorted(unsortedfile,key=lambda l: int(l.split('\t')[2]))

获取未排序的文件,按标签拆分行,第3列,将其更改为int并按此排序。我可以为任何一列做同样的事情。

我正在寻找的是通过所有日期/时间列对其进行排序的更好方法。按年份排序,然后按月计算,然后按天计算......等等。

我可以想到一些复杂的方法(读取组合所有列的每一行,对它进行排序......或者按每列进行递归排序),但是我希望有人有一个更简单,更pythonic ,做同样的事情的方式。

1 个答案:

答案 0 :(得分:3)

您可以使用csv模块使用delimiter='\t'解析文件,并在reader对象上应用sorted(),并使用自定义key函数解析日期到datetime对象:

import csv
from datetime import datetime
from pprint import pprint


def sort_by_datetime(line):
    return datetime.strptime('{0}-{1}-{2}'.format(*line[2:5]), '%Y-%m-%d')


with open('input.txt') as f:
    reader = csv.reader(f, delimiter='\t')
    pprint(sorted(reader, key=sort_by_datetime))

对于input.txt

User1 System1 2013 1 31
User2 System2 2014 12 1
User3 System3 2012 12 31
User4 System4 2012 6 15
User5 System5 2014 1 1

它会打印出来:

[['User4', 'System4', '2012', '6', '15'],
 ['User3', 'System3', '2012', '12', '31'],
 ['User1', 'System1', '2013', '1', '31'],
 ['User5', 'System5', '2014', '1', '1'],
 ['User2', 'System2', '2014', '12', '1']]