这是python脚本:
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文件,我用字符串“input”替换第二列的内容。但是,我需要首先从该列内容中获取一些信息。
内容可能如下所示:
failurelog_wl","inputfile/source/XXXXXXXX"; "**X_CORD2**"; "Invoice_2M";
"**Y_CORD42**"; "SIZE_ID37""
你可以看到它有奇怪的数据类型,尤其是它在行尾有2个双引号而不是你期望的那个。
我需要在替换列值之前提取XCORD
和YCORD
信息,例如XCORD = 2
和YCORD = 42
。然后,我想插入一个名为X_Y
的额外列,代表(2_42)
。
如何修改我的脚本呢?
答案 0 :(得分: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”时,这才有效。如果有时格式略有不同,则需要调整正则表达式以允许这种情况。如果发生这种情况,我添加了断言以提供更有用的错误消息。
您提到要将列命名为X_Y。您的脚本似乎假设没有标题,我的修改版本肯定会做出这样的假设。同样,如果有标题行,你需要调整它。
而且,是的,我同意其他评论者的说法,一般来说,使用csv模块可以更清晰地读取和编写csv文件。