2016-06-13 51 views
0

給出一個簡單的CSV文件是這樣的:Python和CSV;如何截斷列中的所有值?

Django,Gunslinger,101-707 
KingSchultz,Dentist,205-707 
Tatum,Marshall,615-707 
Broomhilda,Wife,910-707 
...,...,... 

你如何截斷在最後一列中的所有值,以便只有前三位依然? (無關:這樣他們就可以在數學運算中使用)

期望CSV:

Django,Gunslinger,101 
KingSchultz,Dentist,205 
Tatum,Marshall,615 
Broomhilda,Wife,910 
...,...,... 

這裏是我到目前爲止已經試過:

import csv 
import re 
r = csv.reader(open(input.csv)) 
for row in r: 
    re.sub('\-.*', '', row[3]) 
writer = csv.writer(open('output.csv', 'w')) 
writer.writerow(row) 

我在re.sub驗證regex正常工作。已經嘗試了幾十個變體,搜索了很多小時,但無法獲得所需的輸出。

回答

0

不使用re模塊,

import csv 

r = csv.reader(open("sample.csv", "rb")) 
writer = csv.writer(open("output.csv", "wb")) 

for row in r: 
    row[2] = row[2][:3] 
    writer.writerow(row) 

由於@TigerRedMike在Python 3.X指出,而不是'rb'和應分別使用'wb','r''w'來讀取和寫入文件。

+0

測試了Python 2.7.6和3.4.3的工作。謝謝@ praba230890。我編輯了答案,以包含一個簡單的錯誤,可能會讓Python 3.4.3上的其他人感到困惑。 – TigerRedMike

+0

你能解釋'[:3]'的語法嗎? – TigerRedMike

+0

它是字符串切片,[:3]切片字符串的前3個字符並返回它。看看https://docs.python.org/3/tutorial/introduction.html#strings – praba230890

0

re.sub返回帶有替換的字符串。它不影響第三個參數本身

0

首先是re.sub返回一個新的值,它不會替換行中的值。

其次,row是一個運行變量,你應該在循環內處理這個。

這裏你的代碼修改爲正常工作(爲python3):

import csv 
import re 
r = csv.reader(open('.../test.csv')) 
with open('.../test2.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile, delimiter=',') 
    for row in r: 
     row[2] = re.sub('\-.*', '', row[2]) 
     writer.writerow(row) 
+0

經測試正在使用Python 2.7.6和3.4.3。謝謝@DomTomCat。由於此答案使用正則表達式,因此它可用於複雜的編輯。 – TigerRedMike

+0

[過早優化是所有邪惡的根源--DonaldKnuth](http://c2.com/cgi/wiki?PrematureOptimization) – praba230890

0
import csv 
import re 

r = csv.reader(open('input.csv')) 
writer = csv.writer(open('/tmp/output.csv', 'w')) 

for row in r: 
    tmp = re.sub('\-.*', '', row) 
    writer.writerow(tmp) 
+0

請給你的代碼解釋。 – runDOSrun