2017-07-18 19 views
0

私は大きなファイル.csvと50個のカラムを持っています。最初のフィールドは "name"です。最後の2つのフィールドは正と負の両方の数字を持ちます。私は最後の2つのフィールドを通過し、両方のフィールドの値が負である行を取得したい。 3つのフィールドがある新しいファイルを作成します。最初のものは名前で、2番目と3番目のフィールドは対応する値を持ちます(両方とも負です)。ここに入力と出力の例を示します。csvモジュールを使ってPythonでフィールドを抽出する

入力:

ZNF449 -1.53 -0.45 
CASKIN1 -1.58 -1.42 
CAMK2B 0.31 0.23 
RP11-644F5.11 -1.12 -0.94 
DET1 -0.42 -0.44 
NEK8 0.04 -0.4 
CPM 1.26 1.16 
CA11 0.16 0.08 
DSE -0.06 0.12 
GALM -0.03 0.04 
HSPA12A 0.22 0.14 
CCDC82 0.33 0.76 
AC025171.1 1.24 1.27 
CARD14 -0.91 -0.79 

が出力:

ZNF449 -1.53 -0.45 
CASKIN1 -1.58 -1.42 
RP11-644F5.11 -1.12 -0.94 
DET1 -0.42 -0.44 
CARD14 -0.91 -0.79 

私はPythonでそれを行うことができますか?

私はこれを試しましたが、私が欲しいものを返せませんでした。

import csv 
with open('data.csv', 'r') as file, f = open('out.csv', 'w') 
    dat = csv.reader(file, delimiter=',') 
    for row in dat: 
     if row[39] == row[40]: 
    new = row[0] + row[39] 
    f.write(new + "\n" ) 

答えて

0

csvには3行しかありません。したがって、row[0],row[1]、およびrow[2]のみが存在し、アクセス可能です。

コンテキストマネージャも正しく使用されていません。以下に示すように、with ... asがコンマで区切られている必要があります。また、outファイルの場合は、CSVライターの使用をお勧めします。

さらに、私は名前をちょっと修正しましたので、何が起こっているかを少しだけ読みやすくしています。ここでは完全なリストです。念のために、テストその後、

import csv 
with open('data.csv', 'r') as fin, open('out.csv', 'w') as fout: 
    dat_in = csv.reader(fin, delimiter=',') 
    dat_out = csv.writer(fout) 
    for row in dat_in: 
     i, j = map(float, row[1:]) # retrieves row[1] and row[2] and converts those column values to floats and assigns them to i and j 

     if i < 0 and j < 0: 
      dat_out.writerow([row[0], i, j]) 

それはiかなり可能だとjはすでに浮かぶているが、私はあなたのデータを100%確実ではないので、私は変換してると

関連する問題