2015-04-07 111 views
0

我對Python中的csv模塊相當不熟悉,想知道是否有人可以提供任何指針。我一直在研究關於這個問題的其他許多問題,但沒有找到我的答案。在Python中使用CSV模塊替換其他值使用Python

我想要做的是改變值,在這種情況下,它將是「不適用」,並將其替換爲0在我的csv文件中。這些n/a值在所有列中,因此我無法將其指定到一個特定列。

這是我到目前爲止的代碼:

with open("MyCSV.csv","rb") as infile,open("Write.csv","wb") as outfile: 
    reader= csv.reader(infile) 
    writer= csv.writer(outfile) 
    conversion= set('(n/a)') 
    for row in reader: 
     newrow=[''.join('0' if c in conversion else c for c in entry)for  entry in row] 
     writer.writerow(newrow) 

我在結果遇到的問題是,任何一個或N被轉換爲0。這顯然是因爲它正在讀取每一個「 n'或'a'應該被轉換。

感謝任何幫助的人可以給。

回答

1

set需要一個序列並使用該序列中的所有項目來設置該集合。由於字符串是序列,所以最終結果是:

set('(n/a)') 
Out[7]: {'(', ')', '/', 'a', 'n'} 

即,每個單獨的字符作爲項目。如果你想設置有一個項目,全部(N/A)的字符串,然後進行單個項目的列表:

set(['(n/a)']) 
Out[8]: {'(n/a)'} 
+0

這是真的,但OP仍然需要改變'newrow'線。現在,操作系統正在循環播放字符,這可能不是有意的。 – DSM

+0

這有助於我更好地理解它,但它仍然不適用於我。 –

1

這裏是一種使用csv模塊

with open("MyCSV.csv","rb") as infile,open("Write.csv","wb") as outfile: 
    reader = csv.reader(infile) 
    writer = csv.writer(outfile) 
    for row in reader: 
     row = [x.replace('n/a', '0') if x == 'n/a' else x for x in row] 
     writer.writerow(row) 

Regex可能會在這裏一個更好的選擇,這樣的事情:

import re 
with open("MyCSV.csv", "rb") as f1: 
    lines = f1.read() 
    for line in re.sub('n/a', '0', lines): 
     print line, 
+0

我從來沒有使用過正則表達式,但使用這個腳本似乎沒有工作。考慮到我們只能從這個腳本中的原始文件中讀取,您是否需要在某些時候將它寫入csv? –