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

标签 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 的方法,做同样事情的方法。

最佳答案

您可以使用 csv模块使用 delimiter='\t' 解析文件并应用 sorted()reader 对象上使用自定义 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']]

关于python - 按多列对文本文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23050436/

相关文章:

python - 如何从 python 列表中的元素中提取 float ?

javascript - 抓取当前打开的网页或使用其他方法获取实时 HTML?

android - 未能将 Intent 结果传递回 Activity ,android 图像捕获 Intent

ruby - 复制文件(不使用 FileUtils)

php - 更改服务器上Wordpress生成的文件的权限

javascript - Python - 将 csv 文件转换为 JSON

python - 使用时间模块时写入 csv 不起作用

python - 线程和条件

python - 从 Pandas 的日期列中查找特定日期的日期差异

mysql - 如何使用codeigniter框架在jquery中读取csv文件