2017-08-30 48 views
1

我需要我的程序幫助。 我想閱讀我的標籤文件,然後添加一個新的列(ab)到該文件,我想從字典中獲得(hi)。在tabfile中插入字典

我的詞典被命名爲hi,對於我想要的數據列ab。 數據應該像字典中那樣位於正確的special_name旁邊。請看看我的例子。

我的標籤文件看起來像:

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 

它應該看起來像:

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') 

當我打印,我得到的整個數據,但沒有標題和沒有字典。我會很感激任何幫助。

+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列表中。

在循環遍歷文件中的每一行後,我們創建一個output_list,向其中添加第一行(帶有標題的行),並將'ab'字符串添加到標題欄。

然後我們循環遍歷非標題行的每一行以及與特殊名稱對應的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 

注意幾件事:此代碼會給你一個KeyError如果您有任何的special_name列下的值沒有出現在你的字典hi。爲了簡單起見,我選擇了最容易理解的實現。但它是vulnarable到KeyError

您不必到output_list寫入到一個單獨的文件,您可以更改myData2.tabmyData.tab然而,這將徹底重寫了該文件。如果出現任何問題,您可能會丟失原始文件。所以我個人的偏好是(如果可能)寫入一個新文件。這樣你永遠不會失去原始輸入。

+0

非常感謝。現在我明白如何去做。 – Fox

0

我會建議你使用Python的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) 

給你一個製表符分隔的輸出文件,用您的標題正確地從你的輸入csv文件複製:

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