2013-03-12 105 views
-1

这是python脚本:如何使用python处理CSV列中的双引号?

f = open('csvdata.csv','rb') 
fo = open('out6.csv','wb') 

for line in f: 
    bits = line.split(',') 
    bits[1] = '"input"' 
    fo.write(','.join(bits)) 

f.close() 
fo.close() 

我有一个CSV文件,我用替换字符串“输入”的第二列的内容。但是,我需要首先从该列内容中获取一些信息。

内容可能是这样的:

failurelog_wl","inputfile/source/XXXXXXXX"; "**X_CORD2**"; "Invoice_2M"; 
"**Y_CORD42**"; "SIZE_ID37"" 

它具有不可思议的数据类型,你可以看到,特别是它有2个双引号在该行,而不只是一个,你会期望结束。

在替换列值之前,我需要提取XCORDYCORD信息,如XCORD = 2YCORD = 42。然后我想插入一个名为X_Y的额外列,它代表(2_42)

如何修改我的脚本来做到这一点?

+2

你知道,Python有一个'csv'模块可以使用。 – squiguy 2013-03-12 07:05:01

+0

我不知道如何从第二栏内容中获取信息。它有奇怪的数据类型。 – user2159674 2013-03-12 07:08:30

+0

我上面展示的例子是第二列内容数据。 – user2159674 2013-03-12 07:15:27

回答

1

如果我正确理解你的问题,你可以使用一个简单的正则表达式拔出你想要的数字:

import re 

f = open('csvdata.csv','rb') 
fo = open('out6.csv','wb') 

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

    x_y_matches = re.match('.*X_CORD(\d+).*Y_CORD(\d+).*', bits[1]) 
    assert x_y_matches is not None, 'Line had unexpected format: {0}'.format(bits[1]) 
    x_y = '({0}_{1})'.format(x_y_matches.group(1), x_y_matches.group(2)) 

    bits[1] = '"input"' 
    bits.append(x_y) 

    fo.write(','.join(bits)) 

f.close() 
fo.close() 

请注意,这只会工作,如果第2列总是“X_CORD”和“Y_CORD说'在数字之前。如果它有时是一种稍微不同的格式,则需要调整正则表达式以适应这种情况。如果发生这种情况,我添加了assert以提供更有用的错误消息。

您提到希望该列被命名为X_Y。你的脚本似乎假定没有标题,我的修改版本肯定会做出这个假设。同样,如果存在标题行,则需要进行调整。

而且,是的,我同意其他评论者的意见,即使用csv模块,读写csv文件通常会更清洁。

+0

我有一个标题....我想要X_Y作为一个新的列,或者我可以只替换第二列的内容而不是添加新列 – user2159674 2013-03-12 09:40:25