使用 python 根据 CSV 上的当前行更新先前的行

Update previous rows based on the current row on CSV with python

这是我的 CSV 文档。 :


Product code,Year,Month,Measurement period,Rainfall amount
1a,1962,01,0,01
1s,1962,01,1,02
1d,1962,01,0,03
1f,1962,01,0,04
1z,1962,01,0,05
1x,1962,01,0,06
1c,1962,01,3,07
1q,1962,01,0,01
1w,1962,01,0,02
1e,1962,01,0,03
1r,1962,01,0,04
1t,1962,01,4,05
1y,1962,01,0,06
1k,1962,01,0,07

这是代码:

import csv



path = r"C:\FEWS\Sample.csv"
fields = ['Product code','Year','Month','Measurement period','Rainfall amount']
output2 = r"C:\FEWS\Sample2.csv"


with open(path,'r') as x, open(output2, 'w', newline='') as output:
    reader = csv.DictReader(x, fieldnames=fields)
    writer= csv.DictWriter(output, fieldnames=fields)
    for row in reader:
        try:
            if int(row['Rainfall amount']) > 1:
                Measure_period = row['Measurement period']

                for x in range(int(Measure_period) -1):
                    pass
                    # Update the previous rows
        except ValueError:
            pass
        writer.writerow(row)

我想做的是,如果测量周期高于 1,假设它是 3,则只修改当前行之前的前 3 行的降雨量,并使它们的降雨量等于当前行。

输出应该是这样的:

Product code,Year,Month,Measurement period,Rainfall amount
1a,1962,01,0,01
1s,1962,01,1,02
1d,1962,01,0,03
1f,1962,01,0,07
1z,1962,01,0,07
1x,1962,01,0,07
1c,1962,01,3,07
1q,1962,01,0,05
1w,1962,01,0,05
1e,1962,01,0,05
1r,1962,01,0,05
1t,1962,01,4,05
1y,1962,01,0,06
1k,1962,01,0,07



基本上试试这个,它的作用是在处理行时将行添加到列表中。这允许您在需要更新时返回到上一行。它仅在处理完完整的输入文件后才写入输出。 如果此 csv 非常大,这将不是理想的解决方案,因为这种方法会使用大量内存

这将根据 Measurement Period 的内容更新之前的行。它会检查以确保更新落在列表的范围内。例如,如果第二行的 Measurement Period 为 4,您应该只更新第一行而不是 4 行?

例如,这也有可能将两行更新两次。如果第二行的 Measurement Period 为 2,而第三行的 Measurement Period 为 4,会怎样?第三行 Rainfall Value 将覆盖第一行和第二行。这有意义吗?

确保并测试它是否涵盖您的场景。

import csv

path = "Sample.csv"
fields = ['Product code','Year','Month','Measurement period','Rainfall amount']
output2 = "Sample2.csv"


with open(path,'r') as x, open(output2, 'w', newline='') as output:
    reader = csv.DictReader(x, fieldnames=fields)
    writer= csv.DictWriter(output, fieldnames=fields)
    rows = []
    for row in reader:

    try:
        if int(row['Measurement period']) > 1:
            for i in range(int(row['Measurement period'])):
                if len(rows)-(i+1) <= len(rows)-1 and len(rows)-(i+1) >= 0:
                    rows[len(rows)-(i+1)]['Rainfall amount'] = row['Rainfall amount']
        rows.append(row)
    except ValueError:
        pass
writer.writerows(rows)`enter code here`