迭代CSV文件Python

时间:2014-12-03 21:21:27

标签: python regex csv iterator

我有一个看起来像这样的CSV文件

a,b,c
d1,g4,4m
t,35,6y
mm,5,m

我试图用“月份”替换所有m和y之后的数字'和'年'分别。我使用以下脚本。

import re,csv
out = open ("out.csv", "wb")
file = "in.csv"
with open(file, 'r') as f:
    reader = csv.reader(f)
    for ss in reader:
        s = str(ss)
        month_pair = (re.compile('(\d\s*)m'), 'months')
        year_pair = (re.compile('(\d\s*)y'), 'years')

def substitute(s, pairs):
    for (pattern, substitution) in pairs:
        match = pattern.search(s)
        if match:
            s = pattern.sub(match.group(1)+substitution, s)
    return s

pairs = [month_pair, year_pair]
print (substitute(s, pairs))

它确实替换但它只在最后一行上执行,忽略它之前的行。如何让它迭代所有行并写入另一个csv文件?

2 个答案:

答案 0 :(得分:1)

您可以使用正面look-behind

>>> re.sub(r'(?<=\d)m','months',s)
'a,b,c\nd1,g4,4months\nt,35,6y\nmm,5,m'
>>> re.sub(r'(?<=\d)y','years',s)
'a,b,c\nd1,g4,4m\nt,35,6years\nmm,5,m'

答案 1 :(得分:1)

在这一行

print (substitute(s, pairs))

您的变量s只是文件中的最后一行。请注意如何将文件读取中的s更新为当前行。

解决方案(选择一个):

  • 你可以尝试另一个for - 循环迭代所有行。
  • 将替换移到for - 循环中,您可以在其中读取文件的行。这绝对是更好的解决方案!

您可以轻松查找如何编写新文件或更改正在处理的文件。