2016-05-16 17 views
-1

私はあなたが私を助けてくれることを願っている小さな問題を抱えています。私はPython 2.6を使用しています。2つのcsvファイルの値を置き換えます

私は現在、2つのオブジェクト間のやりとりを表すファイルにいくつかの値を再割り当てしようとしています。また、tsv私の他のファイル(FILE2)、一方で

Thing1 Thing2 0.625 
Thing2 Thing3 0.191 
Thing1 Thing3 0.173 

のようなものになります:対話ファイル(file1が)次のようになります基本的に

DiffName1 Thing1 ... 
DiffName2 Thing2 ... 
DiffName3 Thing3 ... 

を、私はfile1を取るしたいと思いますファイル2の対応する​​の値を見つけて、ファイル1と同じレイアウトで新しいファイルを作成しますが、 'Thing1'は 'DiffName1'に置き換えられ、同様に構造はfile1に維持されます。対応する相互作用値を有する2つの列である。

これまでのところ、質問をして、ここで答えを読んでから、私はこのスクリプトと同様の結果を達成した:(私がチェックしましたが、ここにいくつかの冗長/間違ったことがあるかもしれません)

import csv 
import sys 

interaction_file = sys.argv[1] 
Out_file = sys.argv[2] 
f_output = open(Out_file, 'wb') 

ids = {}    

with open('file2') as f_file2: 
    csv_file2 = csv.reader(f_file2, skipinitialspace=True) 
    header = next(csv_file2) 

    for cols in csv_file2: 
     ids[cols[7]] = cols[0] 

with open(interaction_file, 'rb') as f_file1:  
    csv_file1 = csv.reader(f_file1, delimiter='\t')  
    csv_output = csv.writer(f_output, delimiter='\t') 

    for cols in csv_file1:    
     csv_output.writerow([ids.get(cols[0], cols[0]), ids.get(cols[1], cols[1]), cols[2]]) 

しかし何らかの理由で、私はfile2のレイアウトがこのスクリプトが元々書かれていたファイルと少し違っていると思うので、私はこの仕事をすることができませんでした。私は、このファイルの各行を理解しようとかなりの時間を費やしてきたが、私はかなり完全に最終ラインを理解していないので、私はまだかなりそれはおそらく、ランニングを取得することはできません。

csv_output.writerow([ids.get(cols[0], cols[0]), ids.get(cols[1], cols[1]), cols[2]]) 

は誰です私に助言をくれますか?

乾杯、

マシュー

+0

パンダを自由に使用できますか?もしそうなら、pandas joinまたはstr.replace関数を使って試してみてください。 – pmaniyan

+0

それはあなたのためにどのように機能しませんか? –

+0

パンダを自由に使うことができたら、私はちょうどお尋ねしました。 – pmaniyan

答えて

0

は、その行ids[cols[7]] = cols[0]だけ誤植でですが、あなたはあなたの例では唯一の2列を持っているようだ、とあなたは第七列を使用しようとしています。

これは、辞書を宣言して2番目のファイルから読み込むことです。次に、ids.get(cols[0], cols[0])を取得して辞書を検索すると、キーcols[0]が検索され、辞書にない場合は、get関数の第2引数(この場合はcols[0])が返されます。

+0

はい、これは誤植です。それは私が似たような仕事をしたときから私のファイル2の位置7に値を持ち、それを辞書の位置1に変えたい時から残されています。少なくともそれは私の理解です。 –

0

あなたのスクリプトにいくつかの注釈を追加し、いくつかのビットを変更/短縮しました。あなたの入力ファイルが正しい区切り文字を持っている

import csv, sys 

interaction_file, out_file = sys.argv[1], sys.argv[2] 
f_output = open(out_file, 'wb')   

with open('file2') as f_file2: 
    # get lines as list and slice off header row 
    rows = list(csv.reader(f_file2, skipinitialspace=True, delimiter='\t'))[1:] 

    # ids: Thing* as key, DiffName* as value 
    ids = {row[1]: row[0] for row in rows} 

with open(interaction_file, 'rb') as f_file1:  
    csv_file1 = csv.reader(f_file1, delimiter='\t')  
    csv_output = csv.writer(f_output, delimiter='\t') 

    for row in csv_file1: 
     csv_output.writerow([ids.get(row[0], row[0]), ids.get(row[1], row[1]), row[2]]) 
     # ids.get(row[0], row[0]): dict.get(key[, default]) 
     # use value (DiffName*) for key row[0] (Thing*) from ids, 
     # or use row[0] (Thing*) itself 
     # if it is not present as a key in ids 
+0

お手数をおかけいただき、ありがとうございました。あなたのご意見は、私の理解を助けてくれました。 しかし、このスクリプトは私のファイルを変更しません。最後の行のインデックス位置を変更して何がうまくいかないかを理解しましたが、出力には何も影響していません。 (出力は対話ファイルと同じに見えます) –

+0

まあ、そこにデバッグ用の 'print'ステートメントを入れて、実際の行、キー、および値が処理されているかどうか確認してください。 \t \t IDS = {行[1]:行[0]}:DiffName は '名前を表す辞書を生成ids' \t \t印刷行の行の') – schwobaseggl

+0

、それ以外の場合には、遠方から診断することは困難です'期待どおり。私が理解していないことは、最後の行のインデックスの位置を変更するとどうなりますか。 –

0

チェック:docs on dict.getは、あなたが最後の行を理解すべきです。また、エラーメッセージが表示されるのを見ることもできます。

関連する問題