2016-06-13 49 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