2016-07-07 153 views
0

如何用python中的條件替換csv文件中的列?用python替換csv文件中的列?

csv文件包含:

34,2016-06-14 13:37:10,,1,,,t 
34,2016-06-15 13:48:20,,1,,,f 
34,2016-06-16 13:55:34,,1,,,t 
34,2016-06-17 13:48:40,,1,,,f 
34,2016-06-18 13:41:27,,1,,,t 

我想根據條件改變的最後一列。那就是我想用python程序把「t」改爲「1」和「f」爲「0」。

我見過很多例子,但沒有這個條件和例子有點混亂。

我試了一下,但它不工作。我也不知道它是否是正確的方法

f = open('/home/rck/Desktop/attendance/month.csv','rb') 
fo = open('/home/rck/Desktop/attendance/demo.csv','wb') 

for line in f: 
    bits = line.split(',') 

if bits[5] == '"t"': 
    bits[5] = '"1"'  
elif bits[5] == '"f"': 
    bits[5] = '"0"' 
fo.write(','.join(bits)) 

f.close() 
fo.close() 

我該如何做到這一點?

感謝....

+1

你可以顯示你的嘗試,這是非常微不足道的做 – EdChum

+0

你有沒有嘗試過Python中的任何CSV模塊? –

回答

1

在你的例子尋找有7個元素的數組位,所以你需要測試bits[6]bits[5]。 如果你知道你總是想要最後一個,bits[-1]將工作。

此外,我不認爲你的報價'"t"'是正確的。我的表現更好,'t'

最後,最後一個元素(對我來說)包含換行符。 所以要實現匹配,我改變了測試,以這種形式:

if bits[-1] == 't\n': 

這就爲我工作。 rafalmp的答案在搜索中起作用,並在整行中替換,尋找字符't'後跟一個換行符,它就是這樣。

然而,一個設計差異是,當使用基於你的例子的代碼時,如果代碼遇到未知的字符(不是't'或'f'),它會使字符不變。如果不是't'的話,rafalmp的代碼總會將其更改爲'0'。 在您的示例中具有相同效果,請將elif行更改爲else而不進行補充測試。

0

您可以使用正則表達式來完成這項工作:

import re 

for line in f: 
    line = re.sub('\w$', lambda x: '"1"' if x.group(0) == 't' else '"0"', line) 
    fo.write(line) 
+0

感謝您的回答。代碼更改值,但它將't'更改爲'0'而不是'1'我已將行更改爲「line = re.sub('\ w $',lambda x:'0'if x =='t 'else'1',line)「現在它將't'更改爲'1'。 – sathish

+1

對不起,在lambda函數中犯了一個錯誤 - 現在它應該可以正常工作。 – rafalmp

+0

@sathish,請檢查rafalmp所做的修改。 'X。組(0)'應該比較而不是'x' – SilentMonk

0

除非你堅持python,它會很容易地與awk完成如下:

awk '{$7= $7=="t" ? "1" : "0"}1' FS=',' OFS=',' month.csv 

其中使用三元和FS(字段分隔符)和OFS(輸出字段分隔符)與0/1取代7列是,