【问题标题】:Update previous rows based on the current row on CSV with python使用python根据CSV上的当前行更新以前的行
【发布时间】:2020-02-01 19:20:09
【问题描述】:

这是我的 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



【问题讨论】:

    标签: python csv python-3.6


    【解决方案1】:

    基本上试试这个,它会在处理行时将行添加到列表中。如果您需要更新它,这允许您返回到上一行。它仅在处理完整的输入文件后才写入输出。 如果这个 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`
    

    【讨论】:

    • 其实输出没有错 1q(Product code)的雨量值等于05,因为1t的测量周期是4,所以应该修改前4行。如果是 2,它应该修改前 2 行
    • @MehmetAli 我更新了它以考虑测量周期以确定要更新的行数。对其进行测试,看看它是否符合您的要求。
    猜你喜欢
    • 2019-07-06
    • 2021-12-16
    • 2022-01-25
    • 2018-09-06
    • 2021-04-02
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多