按多列对文本文件排序
我有一个文本文件,大约有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]))
先拿到未排序的文件,把每一行按制表符分开,取第三列,把它转成整数,然后根据这个整数来排序。我可以对任何一列都这样做。
我想要的是一种更好的方法,能够按照所有的日期和时间列来排序。也就是说,先按年份排序,然后按月份,再按日期……等等。
我能想到一些复杂的方法来实现这个(比如读取每一行,把所有列合并在一起,然后排序……或者对每一列进行递归排序),但我希望能找到一种更简单、更符合Python风格的方法来做到这一点。
1 个回答
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']]