对 CSV 列求和,同时忽略 python 中介于两者之间的标头



我处理庞大的数据集,有时需要我对有数字的列求和和减去。我能够想出一个可以为我完成工作的代码。让我们以以下示例为例:

id,flag_s,amount
1,A,10
2,B,20
3,A,30

如果下面的代码在flag_s字段中找到"B",它将减去"金额"字段:

import csv
with open("MOCK_DATA with text qualifier.csv","r+",encoding='utf8') as fin:
headerline = fin.readline()
flag = None
debit = 0
value = 0
for row in csv.reader(fin,delimiter=","):
value =row[2].strip()
value = float(row[2]) if value else 0.0
flag = row[1].strip()
if flag == "B":
debit-=value
else:
debit+=value
print (debit)

现在我面临的问题是:有时有多个CSV文件。我们通常需要附加它们,然后在它们上运行代码。假设我得到一个 csv 文件 A,然后我有一个 csv 文件 B;我需要附加两个文件,然后运行总和代码。如果我们采用以下示例:

id,flag_s,amount
1,A,10
2,B,20
3,A,30
id,flag_s,amount
4,B,10
5,A,10
6,B,10

Python 抛出以下错误:

Traceback (most recent call last):
File "sum_csv1_v4_SAP.py", line 11, in <module>
value = float(row[2]) if value else 0.0
ValueError: could not convert string to float: 'amount'

有没有解决这个问题的方法?

你应该使用try/except语句:

try:
value = float(row[2]) if value else 0.0
except ValueError: # A header, perhaps
continue       # Skip the row

在这里,此代码适用于您的用例。

import csv
with open("MOCK_DATA with text qualifier.csv","r+",encoding='utf8') as fin:
headerline = fin.readline()
flag = None
debit = 0
value = 0
for row in csv.reader(fin, delimiter=","):
try:
value = float(row[2].strip())
except ValueError:
value = 0.0
flag = row[1].strip()
if flag == "B":
debit-=value
else:
debit+=value
print (debit)

最新更新