0

次のようなデータ行を含む非常に大きなテキストファイルがあります。

('#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

2 に答える 2

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
于 2012-11-27T04:02:48.747 に答える
1

これはあなたがやろうとしていることの線に沿っています。この方法で行を解析することは非常に壊れやすいことに注意してください(誤った形式の行はそれを壊す可能性があります)

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、正規表現を使用することです。文字列に引用符やカンマが含まれている場合に特別な扱いがあるかどうか知っていますか?

于 2012-11-27T04:20:56.193 に答える