2016-05-16 45 views
-1

我有一個小問題,我希望你能幫助我:)我試圖提供簡化的例子來幫助你明白我的意思。我正在使用Python 2.6。替換兩個csv文件的值

所以,我目前正試圖重新分配表示兩個對象之間交互的文件中的一些值。交互文件(文件1)看起來是這樣的:

Thing1 Thing2 0.625 
Thing2 Thing3 0.191 
Thing1 Thing3 0.173 

雖然我的其他文件(文件2),也tsv,看起來像:

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

從本質上講,我想借此file1 ,在file2中找到對應的​​值,並創建一個與file1具有相同佈局的新文件,但將'Thing1'替換爲'DiffName1'等等,同時保持file1的結構。即具有相應交互值的兩列。

到目前爲止,從提出問題和閱讀的答案在這裏,我已經取得了類似的結果與此腳本:(我檢查了,但有可能在這裏的一些冗餘/錯誤的事情)

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

你有使用熊貓的自由嗎?如果是這樣,請嘗試使用熊貓加入或str.replace功能, – pmaniyan

+0

它究竟如何不適合你? –

+0

我只是在問,如果你有使用熊貓的自由。 – pmaniyan

回答

0

是該行ids[cols[7]] = cols[0]只是一個錯字,你似乎有在你的例子只有2列,你要使用7列。

它的作用是,你聲明一個字典並從第二個文件填充它。然後,當您在字典中搜索得到ids.get(cols[0], cols[0])時,它將搜索關鍵字cols[0],如果它不在字典中,它將返回get函數的第二個參數,在此例中爲cols[0]本身。

+0

是的,這是一個錯字,我的道歉。這是從我有類似的任務,但想要在我的文件2的位置7的值,並將其更改爲位於字典的位置1。至少這是我對這條線的理解。 –

0

我給你的腳本添加了一些註釋,並改變/縮短了一些位。 docs on dict.get應該可以幫助您瞭解最後一行:

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'語句來查看正在處理的實際行,鍵和值。否則難以從遠處診斷) – schwobaseggl

+0

'爲行中的行: \t \t IDS = {行[1]:行[0]} \t \t打印ids' 產生表示'名稱的字典:DiffName 「如預期。我不明白的是,如果我在最後一行更改索引位置,怎麼會在我的輸出結果中沒有顯示。 –

0

檢查您的輸入文件是否有正確的分隔符。而且看到錯誤信息會很好。