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