【问题标题】:Iterate over a CSV file Python遍历 CSV 文件 Python
【发布时间】:2014-12-03 21:21:27
【问题描述】:

我有一个如下所示的 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 文件?

【问题讨论】:

    标签: python regex csv iterator


    【解决方案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'
    

    【讨论】:

      【解决方案2】:

      在这一行

      print (substitute(s, pairs))
      

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

      解决方案(选择一个):

      • 您可以尝试另一个 for-loop 来遍历所有行。
      • 将替换移到您读取文件行的​​for-循环中。这绝对是更好的解决方案!

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

      【讨论】:

        猜你喜欢
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        相关资源
        最近更新 更多