我有CSV文件,我将其转换为字典。字典中的一行如下所示:-
OrderedDict([('MVA', '10072672'), ('Code', 'F5'), ('Tbk Mnth', '01-Dec-16'), ('Branch', 'W0S'), ('Make', 'VOLKSWAGENRSA'), ('Status', 'RISK'), ('Price', '111200.27')])
我正在尝试对“价格”列中的值求和,但n =0。我在做什么错?还有,对不同代码求和的最有效方法是什么?
import csv
linecount = 0
with open(r'C:\Users\anthony\Documents\Test\Data.csv') as file:
reader = csv.DictReader(file)
for row in reader:
print(row)
code = (row["Code"])
if code == 'F5':
linecount += 1
print(linecount)
n = sum([item['Price'] for item in reader])
print(n)
答案 0 :(得分:2)
一个问题是您不能两次遍历读取器。
defaultdict
模块中的collections
类对于分组项目非常方便。
在这里,我们将Price
(为了精确而投射到Decimal
中)收集到列表的字典中,然后对其求和。
import csv
import decimal
import collections
# Defaultdicts are handy in that they never have nonexistent keys;
# if you access an nonexistent key, the constructor (`list` here)
# is invoked.
prices_by_code = collections.defaultdict(list)
with open(r'Data.csv') as file:
reader = csv.DictReader(file)
for row in reader:
price = row.get('Price')
code = row.get('Code')
if code and price:
prices_by_code[code].append(decimal.Decimal(price))
# By this time, `prices_by_code` looks approximately like
# {"5": [1, 2, 3], "8": [4, 5, 6]}
for code, prices in sorted(prices_by_code.items()):
print(code, sum(prices))
答案 1 :(得分:0)
reader
是一个迭代器。通过迭代它可以消耗其值。如果需要保留这些值,则必须将其存储在其他位置。最简单的方法是从迭代器创建一个列表,然后遍历该列表。
例如。
rows = list(reader)
for row in rows:
...
n = sum([item['Price'] for item in rows])
但是,价格将是字符串而不是浮点数。因此,您将理解列表,将其转换为浮点数。例如。 float(item['Price'])