2016-10-07 27 views
0

我有這樣的值添加到一個列和打印結果

Daniel 400 411 f 
Mark 976 315 g 

文件我想添加20到線路[2]和減去從線[1] 20和打印覆蓋這個新的結果行或新的文件。這是我的嘗試。

f=open('w', 'r') 
r = open('w2','a') 
lines=f.readlines() 
for line in lines: 
    new_list = line.rstrip('\r\n').split('\t') 
    q_start=int(new_list[1]) - 20 
    q_end=int(new_list[2]) + 20 
    # I think something is missing here, but I don't know what 
    r.writelines(lines) 
f.close() 
r.close() 

預期結果

Daniel 380 431 f 
Mark 956 335 g 

回答

4
f=open('w', 'r') 
r=open('w2','a') 
lines=f.readlines() 

for line in lines: 
    new_list = line.rstrip('\r\n').split('\t') 
    new_list[1] = str(int(new_list[1]) - 20) 
    new_list[2] = str(int(new_list[2]) + 20) 
    r.write("\t".join(new_list)+"\n") 

f.close() 
r.close() 

這應該工作。基本上,你需要首先將你的線段分成段,然後修改你想要的部分,並將它們縫合在一起。

+0

我試過類似這樣使用連接但沒有工作,可能我犯了一些錯誤。無論如何,你的工作,謝謝! – user3224522

+1

你也可以在Ami Tavory的答案中試用'with'語法。如果忘記關閉文件,這會更方便,更安全。 – Ivan

3

實際上並不需要將所有行讀入內存,然後遍歷它們。它只是延長了代碼並且效率較低。相反,嘗試

with open('w2','w') as out: 
    for line in open('w', 'r'): 
     new_list = line.rstrip('\r\n').split('\t') 
     q_start=int(new_list[1]) - 20 
     q_end=int(new_list[2]) + 20 
     out.write('\t'.join([line[0], str(q_start), str(q_end), line[3]]) + '\n') 

注意使用with to open 'w2'more efficient loop over the 'w''s lines


編輯尋址評論

注意,如果你有多個列(但仍需要僅在1更新那些列和2),你可以在最後一行改爲

 out.write('\t'.join([line[0], str(q_start), str(q_end)] + line[3: ]) + '\n') 
+0

這很好,但如果我有多達10個參數在一行? – user3224522

+0

你是否仍然需要只改變那些在1和2? –

+0

是的,我只改變了1和2,但我有超過10列,我不想寫所有,因爲我也認爲這樣做,但我確信有一個更有效和更好的方法。 。 – user3224522

1

我看到你已經接受了答案,但仍然是,這裏是我的評論。代碼中有幾處錯誤。首先,即使您正確計算了這些值,您仍然可以將它們存儲到兩個未使用的變量(q_startq_end)中。

的第二個錯誤是,你寫入到輸出文件中的不變原始數據(lines列表)和循環內這樣做(檢查identations)。因此,我相信你的輸出是原始文件的N次重複,其中N是其中的行數。

可能的錯誤是使用'a'打開輸出文件。如果有任何內容,它不會被刪除。由於我不確定你的意圖,這可能不是一個錯誤,但請注意,如果你想要一個乾淨的石板。

最後,這裏是我的你的代碼版本,最小修改工作。我將'a'留在了輸出文件的打開過程中,因爲我不知道您是否故意這樣做。

f=open('w.txt', 'r') 
r = open('w2.txt','a') 
lines=f.readlines() 
for line in lines: 
    print line 
    new_list = line.rstrip('\r\n').split(' ') 
    new_list[1]=str(int(new_list[1]) - 20) 
    new_list[2]=str(int(new_list[2]) + 20) 
    r.write('\t'.join(new_list)+"\n") 
f.close() 
r.close() 

我希望這有助於。