python 2.4按特定列排序文本文件

use*_*219 2 python csv

完全是python的新手我在使用2.4版本时遇到了问题

我有一个文本文件,其中包含3个列,它们由制表符分隔,而不是单个选项卡,9个制表符.1000行文件ex:

$1$sda4356:[sgb1_diska5.ldlbat44.libabl]talild_0329_base.rpt                                talild_0329_base.rpt                                                                      00000000000000005062
Run Code Online (Sandbox Code Playgroud)

我需要做的是按列3(00000000000000005062)排序所有内容.

使用csv阅读器是处理这种情况的最佳方法吗?如何处理我的文本文件使用9个选项卡分隔每列的事实.我发现的大多数其他东西都与python 2.4不兼容.

mgi*_*son 5

既然你正在使用9个标签,str.split看起来它应该能够正确处理,(但我没有看到任何理由为什么csv会窒息它...):

fobj = open('data.csv')
data = [ x.split() for x in fobj ]
fobj.close()  #don't forget to close :)
Run Code Online (Sandbox Code Playgroud)

或者可能:

delim = '\t'*9
data = [ x.split(delim) for x in fobj ]
Run Code Online (Sandbox Code Playgroud)

然后你可以排序.在较新版本的python中,您可以:

from operator import itemgetter
data.sort(key=itemgetter(2))
Run Code Online (Sandbox Code Playgroud)

先试试吧!(根据评论和文档,keypython2.4支持,但不支持python2.3). operator.itemgetter也是"python2.4中的新东西",itemgetter(2)相当于lambda x:x[2]或者更详细:

def get2(x):
    return x[2]
Run Code Online (Sandbox Code Playgroud)

但我认为你可能需要依赖于cmp与旧的python版本的兼容性(注意,python3不再支持cmp):

def compare(x1,x2):
    if x1[2] > x2[2]:
       return 1
    elif x1[2] < x2[2]:
       return -1
    else:
       return 0
Run Code Online (Sandbox Code Playgroud)

然后你会分类:

data.sort(cmp=compare)
Run Code Online (Sandbox Code Playgroud)