2012-11-27 46 views
0

我有一個包含類似數據線一個非常大的文本文件:從最高到最低基於列的Python的排序文本文件中的值

('#DownWithAssad', '1') 
('#DownYoTLParty', '1') 
('#Download', '8') 
('#Download:', '2') 
('#Downloads', '2') 
('#DownstairsMixtape', '1') 
('#DowntonAbbey', '12') 
('#DowntonAbbey?', '1') 
('#DowntonPBS', '23') 
('#Downtonabbey', '1') 
('#DowntownAbbey', '1') 

這似乎是一個簡單的問題,但我想軟數據從最高到最低,所以它看起來像:

('#DowntonPBS', '23') 
('#DowntonAbbey', '12') 
('#Download', '8') 
('#Download:', '2') 
('#Downloads', '2') 
('#DownstairsMixtape', '1') 
('#DownWithAssad', '1') 
('#DownYoTLParty', '1') 
('#DowntonAbbey?', '1') 
('#Downtonabbey', '1') 
('#DowntownAbbey', '1') 

據我瞭解,我可以消除括號()和分割數據具有:

import sys 

f = open(sys.argv[1]) 
for line in f: 
    line = str(line)[1 : -1] 
    for sect in line.split(','): 
     print sect 

但是我不確定該從哪裏出發。

回答

4

您可以分析很容易使用ast.literal_eval文本文件:

with open(datafile) as f: 
    file_sorted = sorted((ast.literal_eval(x) for x in f), 
         key=lambda z:(int(z[1]),z[0]), 
         reverse=True) 

工作原理:

(ast.literal_eval(x) for x in f) #turn each line in your file into a tuple 
key=lambda z:(int(z[1]),z[0])  #function to determine how things are sorted. Basically 
            #sort as tuples: `(int(z[1]),z[0])` 
reverse=True      #descending order instead of ascending 
+0

你能解釋這是如何工作的嗎? – secumind

+0

非常感謝你,謝謝你的解釋,我不清楚什麼是key = lambda,但我現在明白了。 – secumind

1

這是一起什麼你正在嘗試做的線條。需要注意的是解析行這種方式是相當脆弱(misformatted線可能會打破它)

from operator import itemgetter 
import sys 

result=[] 
with open(sys.argv[1]) as f: 
    for line in f: 
     line = str(line.strip())[1: -1] 
     sect1, sect2 = line.split(', ') 
     sect1 = sect1[1: -1] 
     sect2 = int(sect2[1: -1]) 
     result.append((sect1, sect2)) 

for line in sorted(result, key=itemgetter(1), reverse=True): 
    print line 

更好的方法來分析它是使用literal_eval或正則表達式。你知道在字符串中出現引號字符或逗號時是否有特殊待遇?

+0

謝謝,這也很好。 – secumind

相關問題