按多列排序文本文件

3

我有一个文本文件,大约有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]))

将未排序的文件,通过制表符分割行,以第三列为准,将其改为int类型后排序。我也可以对任何一列做同样的操作。
我想要的是更好的按照所有日期/时间列进行排序的方式。因此,按年份排序,然后按月份排序,再按日排序等等。
我可以想到一些复杂的方法(读取每一行并结合所有列进行排序...或者通过每一列进行递归排序),但我希望有人能以更简单、更符合Python习惯的方式实现同样的功能。

文件有多大? - dmcauslan
@dmcauslan 我去看了一下在生产环境中文件的大小,但在回答之前还需要修复更多的错误。我猜大约是150MB,但这只是一个猜测。 - BeanBagKing
你有没有看过一些更高级的库,可能会对你有所帮助?我主要是想到了pandas。 - dmcauslan
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']]

返回以下内容的翻译:或者对于sor_by_datetime(),返回return datetime.datetime(*map(int, line[2:-1]))以使其对包含小时、分钟、秒等的情况保持中立。 - desired login
@alecxe 这看起来正是我要找的东西。不过,就像我之前对dmcauslan所说的那样,我发现了一些其他的错误,这些错误阻止了它的完成。最早也要到明天才能解决。我想让你知道我已经看到了这个问题,并且在我解决它后会回来的。 - BeanBagKing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接