1

次のような一連のデータに 4 番目の列を書き込もうとしています

 8000.5   16745     0.1257
 8001.0   16745     0.1242
 8001.5   16745     0.1565
 8002.0   16745     0.1595

その特定のファイルで 2 番目の数値 (つまり 16745) がカウントされた回数を示します (変更されます。リストには数千のエントリがあります)。つまり、これがファイル全体の場合

 8000.5   16745     0.1257   4
 8001.0   16745     0.1242   4
 8001.5   16745     0.1565   4
 8002.0   16745     0.1595   4

私のコードの問題は書き込み段階にあるようで、辞書は機能し、csv.reader はファイルを印刷すると正常に読み取られますが、唯一の辞書キーを追加することになると (フィールド [1]) は16745 が -1 で、そのカウントがすべての行の 4 列目に出力されます。行ごとではなく、この値に対してのみ辞書と相互参照している理由がわかりません。

つまり、私は得る

 8000.5   16745     0.1257   [count of -1 in column 2]
 8001.0   16745     0.1242   [count of -1 in column 2]
 8001.5   16745     0.1565   [count of -1 in column 2]
 8002.0   16745     0.1595   [count of -1 in column 2]

どんな助けでも大歓迎です!

import numpy
import string
import csv
import sys
import os

time = []
water = []
itemcount ={}

global filename
filename = sys.argv[1]

f1 = open(sys.argv[1], 'rt')
for line in f1:
    fields = line.split()
    time.append(fields[0])
    water.append(fields[1])
f1.close()

for x in water:
    a = water.count(x)
    itemcount[x] = a

writerfp = open('watout.csv', 'w')
writer = csv.writer(writerfp)
for row in csv.reader(open(filename, 'r')):
    fields = line.split()
    row.append(itemcount[fields[1]])
    writer.writerow(row)
writerfp.close()    
4

2 に答える 2

1

これが当てはまるかどうかはわかりませんが、最後のループで間違ったループ変数を使用している可能性があります。

fields = line.split()

lineループ全体で変更されないため、辞書で同じキーを使用することになります。

于 2012-05-31T10:23:57.817 に答える
1

エラーの理由は最後のループにあります。あなたはラインをドロップする必要があります

fields = line.split()

次の行を次のように変更します

row.append(itemcount[row[1]])

コードにはさらにいくつかの問題があります。

  1. filenameグローバル スコープでグローバルとして宣言します。とにかくグローバルになるので、これは無意味です。さらに、コードの次の行はsys.argv[1]再び使用します。

  2. withファイルを開くにはステートメントを使用する必要があります。

  3. tPython 2.x でファイルを開く場合、モードはありません。

  4. カウントを決定するアルゴリズムは非常に非効率的です。リストの各エントリについて、リスト全体を反復処理しています。1回のパスでやり遂げることができます。

これらの問題をすべてクリーンアップし、未使用の変数をすべて削除すると、次のコードで作業を完了できます。

import collections
with open(sys.argv[1], "r") as input:
    counts = collections.Counter(line.split()[1] for line in input)
    input.seek(0)
    with open("watout.csv", "w") as output:
        for line in input:
            count = counts[line.split()[1]]
            output.write(line.rstrip("\n") + "\t" + str(count) + "\n")
于 2012-05-31T10:52:13.637 に答える