3

次のような 2 列にデータが書き込まれた複数のファイルがあります。

asp 1.88
gln 3.10
arg 0.99
his 1.11

asp 0.99
gln 1.11
arg 0.08
his 0.01

等々。

私がやりたいのは、それらを追加して、次のような新しいファイルに書き込むことです。

asp 2.87
gln 4.21
arg 1.07
his 1.12

インポートしてみましCounterたが、うまくいきません。私もこのように試しました:

inp = ('c"/users/ansm/desktop/xx.txt','r').read().strip().split('\n')
inp2 = ('c"/users/ansm/desktop/xyz.txt','r').read().strip().split('\n')
c = Counter(inp)
d = Counter(inp2)
print c+d

しかし、このコードは値を合計しません。

を使用せずにそれを行う他の方法はありますCounterか? 私は、フォーマットglob.iglobのあるファイルのフォルダー全体を反復.txt処理してから、それらを処理して上記の結果を取得したいと考えていました。を使用Counterするのが最も効率的な方法ですか、それとも他の方法がより効果的ですか?

4

4 に答える 4

3

この構成を使用してカウンターを作成します。

c = Counter(dict((x.split()[0], float(x.split()[1])) for x in inp))
d = Counter(dict((x.split()[0], float(x.split()[1])) for x in inp2))

結果c+dは次のようになります。

Counter({'gln': 4.21, 'asp': 2.87, 'his': 1.12, 'arg': 1.07})

多くのファイルの編集:

s = Counter()
for filename in glob.iglob('*.txt'):
    with open(filename, 'r') as f:
        for line in f:
            k, v = line.split()
            s[k] += float(v)
print s
with open('sum.txt', 'w') as f:
    for k, v in sorted(s.iteritems()):
        f.write('{0} {1}\n'.format(k, v))
于 2012-06-04T11:20:11.837 に答える
1

defaultdict を使用するのはどうですか:

from collections import defaultdict
import glob

d = defaultdict(float)

for filename in glob.iglob('*.txt'):
    with open(filename, "r") as f:
        for line in f:
            k,v = f.split(" ")
            d[k] += float(v)

with open("output.txt", "w") as out:
    for k, v in d.iteritems:
        out.write("%s %f\n" % (k,v))
于 2012-06-04T12:01:35.813 に答える
0

元のカウンターは値の数値ではなく文字列を格納しているため、次のように両方のカウンターの各要素を追加する必要があります(float()変換に注意してください)。

r = Counter(c)
for k, v in d.items():
    r[k] += float(v)

これで、追加された値はになりrます。cより簡単なアプローチは、作成時に直接変換を実行することdです。

c = Counter((p[0], float(p[1])) for p in map(lambda s: s.split(), inp))
d = Counter((p[0], float(p[1])) for p in map(lambda s: s.split(), inp2))

これで、これは意図したとおりに機能します。

c + d
> Counter({'gln': 4.21, 'asp': 2.87, 'his': 1.12, 'arg': 1.07})

また、ファイルの読み取り方法が最も安全ではないことにも注意してください。ファイルを開くが決して閉じない場合はwith open、次のようなものを使用することをお勧めします。

inp = []
with open('c:/users/ansm/desktop/xx.txt', 'r') as input:
    for line in input:
        inp.append(line.strip())
于 2012-06-04T11:22:20.060 に答える
0

このアプローチはどうですか(Counter要求に応じて使用しないで):

with open('xx.txt') as f1, open('xyz.txt') as f2, open('result.txt', 'w') as outf:
    for line1 in f1:
        for line2 in f2:
            count = float(line1.split()[-1]) + float(line2.split()[-1])
            outf.write('{:s} {:.2f}\n'.format(line2.split()[0], count))

含まれるものresult.txt:

asp 2.87
gln 2.99
arg 1.96
his 1.89

これは、データに同じキーが含まれており、それらが同じ順序になっていることを前提としています。

コンストラクトを使用するwithと、完了時または例外が発生した場合に、3 つのファイルが自動的に閉じられます。

于 2012-06-04T11:18:52.993 に答える