3

私はPythonにかなり慣れていません。非常に大きな.csvファイル(約680万行)のデータを処理しようとしています。行の例は次のようになります。

Group1.1    57645   0.0954454545 
Group1.1    57662   0.09556544778
Group1.13   500 0.357114538 
Group1.13   504 0.320618298 
Group1.13   2370    0.483851368 
Group1.14   42  0.5495688

最初の列はグループを示し、2番目は位置を示し、3番目は計算を実行するために読み込んでいる値を示します。これらの計算は、位置に基づいた「スライディングウィンドウ」で実行しようとしています。もう1つの要因は、グループごとに位置番号が再開されるため、各グループが互いに別々に計算されることです。私のコードでは、何かをする前にまずグループIDをリストとして読み取ろうとし、そのリストを「一意化」してから、そのリストをその特定のグループに対してのみ「スライディングウィンドウ」を実行するための基礎として使用します。次に、一意のリスト内の次のグループIDに移動して、計算を再実行します。これが私のコードの基本です(unique1関数はリストを一意化する簡単な方法です:

for row in reader:
    scaffolds.append(row[0])
    unique1(scaffolds)
    newfile.seek(0)
    reader=csv.reader((line.replace('\0','') for line in newfile), delimiter="\t")
    if row[0] == unique_scaffolds[i]:
        #...perform the calculations
    else:
        i+=1

私が遭遇している私の問題は、それが私のデータセットの最初の行を読み取っているだけで、それ以上は何も読み取っていないということです。したがって、「リーダーの行の場合」の直後に「行の印刷」を挿入すると、次のような出力が得られます。

['Group1.1', '424', '0.082048032']

これ以上の計算やループを行わずにこれとまったく同じコードを作成すると、データセット内のすべての行が出力されます。この状況では、このループの最初のすべての行をどのように読み取るのでしょうか。

4

3 に答える 3

1

毎回リーダーを再初期化しています。基本的に、これは最初の行で動かなくなる原因となっています。これを試して

reader=csv.reader((line.replace('\0','') for line in newfile), delimiter="\t")
for row in reader:
    scaffolds.append(row[0])
    unique1(scaffolds)
    newfile.seek(0)

    if row[0] == unique_scaffolds[i]:
        #...perform the calculations
    else:
        i+=1
于 2012-11-19T18:10:50.067 に答える
0

ループ内でリーダーオブジェクトを置き換えているように見えます。それを修正する(またはそれを取り除く)と、おそらくこれを機能させるための幸運が得られるでしょう。

于 2012-11-19T18:11:37.360 に答える
0

cvsreader は一度に 1 行しか読み取らないことに注意してください。一度に 1 行ずつ読み込んで、独自のリストを生成する必要があります。

于 2019-09-28T11:30:59.973 に答える