2013-11-01 104 views
1

input.txt是製表符分隔的。替換某些列的Python

我知道一個簡單的代碼來替換。

import fileinput 
for line in fileinput.FileInput("input.txt",inplace=1): 
    line = line.replace("AA","0") 
    print line, 

但是,我想僅更換input.txt中(而不是整個文件input.txt中)的第3列的細胞,也想通過0替換的細胞,如果它是或AA中的任一項AAA或BB或BBB,如果不是它們中的任何一個,則將其替換爲1。

在這裏,我說的是「匹配整個單元格內容」

通過「匹配整個單元格內容,」我的意思是,它會被替換,只有當一個細胞(如(2,3) - 元素input.txt)完全是AA或AAA或BB或BBB。諸如「AAs」的單元不會被任何東西取代。相反,如果沒有應用「匹配全部細胞內容物」,則只要細胞僅「包含」AA或AAA或BB或BBB,它就會被替換。所以一個單元格「AAhaha」將被替換爲「0haha」

無論如何,重複一遍,我想替換input.txt的第三列(而不是整個文件input.txt)的單元格,我想如果它是AA或AAA或BB或BBB中的任何一個,則將單元替換爲0,如果它不是其中任何一個,則以「匹配整個單元內容」方式替換單元1。

+0

@MartijnPieters:如果它是一個CSV文件(當然,TSV)。我有時遇到了不是TSV的製表符分隔的數據。 –

+0

@MartijnPieters我的輸入是txt,製表符分隔,UTF8沒有BOM。一個txt文件也可以是csv?那我怎麼檢查我的輸入是否是csv? – user1849133

+0

@ user2604484:CSV是一種文本格式;它是包含由分隔符分隔的數據列的任何文本文件,可以是逗號,管道符號,選項卡或任何其他文件。 –

回答

2
for line in fileinput.FileInput("input.txt",inplace=1): 
    cells = line.split('\t') 
    cells[2] = '0' if cells[2] in ('AA', 'AAA', 'BB', 'BBB') else '1' 
    print '\t'.join(cells), 

請注意,我已經對製表符分隔的數據進行了簡單化處理。如果您的文件使用整個CSV/TSV格式,包含製表符和/或換行符的帶引號的單元格,那麼您需要csv,這是一個適當的CSV解析器。

相反,如果你想在列0細胞含有例如"a"以輸出爲"a",則必須使用csv,因爲讀書時,它會刪除引號,而不是重新插入他們的作品。因爲他們不是那個單元所需要的。

所以,首先你必須確定文件格式是如何定義的,然後你可以選擇如何讀寫它。無論哪種方式,修改它將大致相同。

另外一個問題:我沒有做任何關於linebreak的事情,所以它只會坐在最後一個單元格中。因此,如果第三個單元格最後一個單元格,它將在單元格被替換爲"0""1"時刪除,這可能不是您想要的。雖然我們在談論單元的數量,但如果任何一行少於3個單元,這段代碼當然會拋出異常。您應該決定如何處理該問題,特別是在文本文件末尾找到空白行並不罕見。

+0

@Steve_Jessop「如果第三個單元格是當單元格替換爲」 0「或」1「,這可能不是你想要的」哦,第3列確實可能是最後一列,我該怎麼辦呢? – user1849133

+0

我的輸入是txt,製表符分隔,UTF8沒有BOM。txt文件也可以是csv?那麼我怎樣才能檢查我的輸入是csv? – user1849133

+0

@ user2604484:「我該怎麼做?」 - 可能最好在分割'\ t'之前關閉換行符,然後在打印時將其重新打開 –

1

你應該使用csv module此:

import csv 
with open("input.txt", "rb") as infile, open("output.txt", "wb") as outfile: 
    reader = csv.reader(infile, delimiter="\t") 
    writer = csv.writer(outfile, delimiter="\t") 
    for row in reader: 
     row[2] = "0" if row[2] in ("AAA", "AA", "BBB", "BB") else "1" 
     writer.writerow(row) 
+0

我運行了你的程序,它似乎是內容的input.txt被刪除後,我運行你的程序。output.txt似乎是正確的,所以如果你的程序可以保持input.txt一樣,那麼它將是完美:) – user1849133

+0

@ user2604484:我可以'想象爲什麼這樣因爲我正在打開'input.txt'只讀。你能重新檢查嗎? –