按多列对文本文件排序

3 投票
1 回答
1958 浏览
提问于 2025-04-18 02:38

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

撰写回答