Обновите предыдущие строки на основе текущей строки в CSV с python - PullRequest
0 голосов
/ 01 февраля 2020

Это мой CSV do c. :


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



1 Ответ

0 голосов
/ 01 февраля 2020

Попробуйте это в основном, что он добавляет строки в список, как они обрабатываются. Это позволяет вам go вернуться к предыдущему ряду, если вам нужно его обновить. Он записывает вывод только после полной обработки входного файла. Это не было бы идеальным решением, если бы этот csv был очень большим, так как этот подход использовал бы много памяти .

Это обновит предыдущие строки в зависимости от значения Measurement Period. Он проверяет, что обновление попадает в диапазон списка. Например, если вторая строка имеет Measurement Period из 4, вам следует обновить только первую строку справа, а не 4 строки?

Имеется возможность обновления двух строк, например, в два раза. Что если вторая строка имеет Measurement Period, равную 2, а строка 3 имеет Measurement Period, равную 4. Третьи строки Rainfall Value будут перезаписывать строки 1 и 2. Имеет ли это смысл?

Убедитесь и проверьте это, чтобы увидеть, охватывает ли он ваш сценарий ios.

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`
...