2017-08-30 18 views
1

私のプログラムに助けが必要です。 私は自分のタブファイルを読んで、そのファイルに新しい列(ab)を追加したいと思います。これは辞書(hi)から取得したいものです。辞書をタブファイルに挿入する

私の辞書の名前はhi、列の場合はabのデータが必要です。 データはディクショナリ内の正しいspecial_nameの横にある必要があります。私の例を見てください。

のように私のタブのファイルが見えます:次のように私のスクリプトがある

Names names_id first second special_name ab 
lili  1   a  b Tm   a 
Katrin 2   c  d Tm   a 
Paul  3   e  f ui   f 
bob  4   g  h zb   b 
tina  5   i  j ac   a 

with open("myData.tab","r") as file: 
     hi = {'ac':{'ab': 'a', 'po':'pb'}, 
      'Tm':{'ab': 'a', 'po':'h'}, 
      'ui':{'ab': 'b', 'po':'h'}, 
      'zb':{'ab': 'f', 'po':'j'}} 
     for line in file: 
      line = line.strip() 
      columns = line.split("\t") 
      print(line) 
       for row in columns: 
        file.append('ab') 

私は私が得ることを印刷する場合それはのようになります

Names names_id first second special_name 
lili  1   a  b  Tm 
Katrin 2   c  d  Tm 
Paul  3   e  f  ui 
bob  4   g  h  zb 
tina  5   i  j  ac 

ヘッダーなしで、辞書なしではデータ全体が表示されます。私はどんな助けにも感謝しています。

+0

どこに印刷するのかわかりません。[mcve]全体が確実ですか? –

+0

私は印刷しました(ライン)。私はそれが私に全データを与えるかどうかテストしました。 – Fox

+0

また、あなたのタブファイルの例とそれを後でどのように見えるかを追加してください。 –

答えて

0

次のコードは、質問に必要な出力を示しています。 ただし、元の投稿と比較するときは、いくつか検討する必要があります。

with open('myData.tab.tab','r') as input_file: 
    hi = {'ac':{'ab': 'a', 'po':'pb'}, 
      'Tm':{'ab': 'a', 'po':'h'}, 
      'ui':{'ab': 'b', 'po':'h'}, 
      'zb':{'ab': 'f', 'po':'j'}} 
    columns=[] 
    for line in input_file: 
     line = line.strip() 
     columns.append(line.split('\t')) 
    output_list = [columns[0]+['ab']] 
    for row in columns[1:]: 
     row.append(hi[row[-1]]['ab']) 
     output_list.append(row) 


with open('myData.tab2.tab','w') as output_file: 
    for row in output_list: 
     output_file.write("\t".join(row)+'\n') 

オリジナルの投稿と比較すると、ファイルは同じように開いています。辞書はまだ作成されていますが、私はファイルオブジェクト名をfileからinput_fileに変更しました。

このコードでは、columnsという空のリストが作成されます。その後、ファイル内のすべての行を、コード内で実行したのと非常によく似ています。唯一の違いは、各行をcolumnsリストに追加することです。

ファイル内のすべての行をループした後、最初の行(ヘッダー付きのもの)を追加し、ヘッダーローに 'ab'文字列を追加するoutput_listを作成します。

次に、非ヘッダー行であるすべての行と、special_nameに対応するhi辞書の値を各行にループします。次に、行をoutput_listに追加します。 次に、別のファイルを開き、ouput_listの各行をその行に書き込みます。結果はこの出力になります(結果はタブ区切りがSO上のここではあまりにも僅かです)。

Names names_id first second special_name ab 
lili 1 a b Tm a 
Katrin 2 c d Tm a 
Paul 3 e f ui b 
bob 4 g h zb f 
tina 5 i j ac a 

ノートのいくつかのこと:special_name列の下のあなたの値のいずれかがあなたのhi辞書に存在しない場合、このコードはあなたにKeyErrorを与えるだろう。わかりやすくするために、最も理解しやすい実装を選択します。しかし、あなたが別々のファイルにoutput_listを記述する必要はありません、これは完全にゼロからファイルを書き換えますが、あなたはmyData.tabmyData2.tabを変更することができますKeyError

にvulnarableです。何かが間違っていたら元のファイルが失われる可能性があります。だから私の個人的な好みは、(可能な場合)新しいファイルに書き込むことです。この方法で元の入力を失うことはありません。

+0

ありがとうございました。今私はそれを行う方法を理解しています。 – Fox

0

私はあなたが、それは物事が容易になりますようにこれを行うためのPythonのcsvライブラリを使用することをお勧めします:

あなたのヘッダが正しく入力csvファイルからコピーして、あなたにタブ区切り出力ファイルを与える
import csv 

hi = { 'ac':{'ab': 'a', 'po':'pb'}, 
     'Tm':{'ab': 'a', 'po':'h'}, 
     'ui':{'ab': 'b', 'po':'h'}, 
     'zb':{'ab': 'f', 'po':'j'}} 

with open('myData.tab', 'rb') as f_input, open('myData output.tab', 'wb') as f_output: 
    csv_input = csv.reader(f_input, delimiter='\t') 
    csv_output = csv.writer(f_output, delimiter='\t') 

    # Copy over the header to the output file and add the new column 
    csv_output.writerow(next(csv_input) + ['ab'])  

    for row in csv_input: 
     row.append(hi[row[4]]['ab']) 
     csv_output.writerow(row) 

Names names_id first second special_name ab 
lili 1   a  b  Tm    a 
Katrin 2   c  d  Tm    a 
Paul 3   e  f  ui    b 
bob  4   g  h  zb    f 
tina 5   i  j  ac    a 

csvライブラリが自動的にファイルの各行を読み込み、リストにそれを正しく変換することができます。ファイルに書き戻すときに必要なことは、リストに与えることだけで、各値の間に必要な区切り文字が自動的に追加されます。これは、区切り文字自体を含む可能性のある文字列を処理する必要がある場合に、より重要になります。

+0

ありがとうございます。それはいい考えです – Fox

関連する問題