2016-05-05 1 views
1

私は自動化したい仕事があり、助けてくれるでしょう:)タブ区切りのファイルの列を読んで、別のファイルで一致するエントリを検索してから、用語を置き換えたい

3つの列(ヘッダーなし)を含むタブ区切りファイルがあります。最初の2つの列には識別子が含まれ、3つ目の列には数値が含まれます。私は、コードのこの部分を使用してこのファイルの列を読んでいる、これまでのところ

ID1 ID2 0.123 
ID3 ID4 0.456 
ID5 ID6 0.789 

:それは少しので、のように見える

素晴らしいです
with open(f) as tsv: 
    for column in zip(*[line for line in csv.reader(tsv, delimiter="\t")]): 
     for i in column: 
      Change_Name(i) 

。 print文をインクルードすると、それぞれの3つのカラムのエントリを含む3つのタプルが返されます。

次に、別のファイルを繰り返して、各IDのエントリに一致する行を見つけ、元のファイルの値を一致する行の 'name'フィールドのエントリに置き換えます。 3つ目の列は、2つのID間の相互作用を表すときと同じにする必要があります。

これまでは、1つの引数をとり、もう1つのcsvファイルを開き、それを反復してIDに一致する行を見つけました。一致するものが見つかると、その行の別のフィールドの値を出力します。機能は少しのようになっていること:

def Change_Name(ID): 
     file_csv = csv.DictReader(open('file.csv')) 
     for row in file_csv: 
      if row['ID'] == ID: 
        print(row['Name']) 

私はしかし、実現したいことは何Name値はそれを見つけるために使用されるIDと同じ位置に置換されていることです。私はstr.replaceを使いこなしましたが、これまでのところ、最初のものと同じ方法で構造化されたファイルを作成することができましたが、IDNameに置き換えられました。

私の質問が意味をなさないことを願っています。どんな助けも大変に感謝しています。

編集:私は他のファイルの例と私が期待していることを示すように求められました。

私の他のファイルには、少しのようになりますので、

ID, Name, att1, att2 
ID1, matt, 8, abc 
ID2, jo, 17, def 

私は上記示したようなファイルを使用していた場合、私はID1ID2エントリを交換し、それらを置き換えるために私のスクリプトが欲しいですそのような「マット」と「ジョー」:

matt jo 0.123 
ID3 ID4 0.456 
ID5 ID6 0.789 

のように...

+0

質問を編集して、他のCSVファイルのサンプルと予想される出力を含めることができますか。 –

+0

いいえ、私はいくつかの明確化を追加しました。 –

答えて

1

あなたがやろうとしている何をすべき以下。最初に、2つ目のファイルをロードします(私はあなたの例に従ってカンマで区切られたcsvと仮定しています)。各エントリは辞書に格納されます。その後、メインタブで区切られたcsvファイルを読み込み、最初の2つのカラムエントリをids辞書の値で置き換えようとします。エントリが存在しない場合、それはそれぞれの既存の値を使用しています。

import csv 

ids = {} 

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

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

with open('file 1.csv', 'rb') as f_file1, open('output.csv', 'wb') as f_output: 
    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]]) 

を含むあなたoutput.csvを与える:

matt jo 0.123 
ID3 ID4 0.456 
ID5 ID6 0.789 

は、Python 2.7を使用してテストされています。9

+0

ありがとうございました:) –

関連する問題