【问题标题】:Sort a text file by multiple columns按多列对文本文件进行排序
【发布时间】:2014-05-27 20:13:51
【问题描述】:

我有一个包含大约 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 , 做同样的事情的方法。

【问题讨论】:

  • 文件有多大?
  • @dmcauslan 我去看看文件在生产中会有多大,并且遇到了更多的错误,我必须先修复才能给出确切的答案。我的猜测是大约 150mb,但这是一个疯狂的猜测。
  • 您是否查看过任何可能对您有所帮助的高级库?我主要想到的是熊猫。

标签: python file csv


【解决方案1】:

您可以使用csv 模块来解析带有delimiter='\t' 的文件,并使用自定义key 函数将sorted() 应用于reader 对象,该函数将日期解析为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']]

【讨论】:

  • return datetime.datetime(*map(int, line[2:-1])) 表示 sort_by_datetime() 不知道是否包含小时、分钟、秒等。
  • @alecxe 这看起来正是我想要的。正如我在上面对 dmcauslan 所说的那样,我发现了一些其他错误,阻止了此操作的完成。最快明天就到了。想让你知道我看到了这个,当我得到它的工作时我会回来。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2021-08-25
  • 2021-09-04
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多