我正在尝试使用包含键的行的第一列来计算csv文件中所有值的总和。所有这些数据都将放在Python的字典中。
到目前为止,我已经提出了这个代码。唯一的问题是并非所有值都是整数,有些是空白的并且包含字符串。我需要更新代码以忽略这些。
显而易见的改进是计算文件的列数而不是假设它有多达三列数据,我不太确定如何实现这一点!
import csv
d = {}
with open(filename) as csvfile:
rdr = csv.reader(csvfile)
if header == True:
next(rdr, None)
for row in rdr:
d[row[0]] = int(row[1]) + int(row[2]) + int(row[3])
return d
我感谢任何帮助!
答案 0 :(得分:3)
使用try/except
将每个元素投射到float
:
import csv
from collections import defaultdict
with open(filename) as csvfile:
next(csvfile)
rdr = csv.reader(csvfile)
d = defaultdict(float)
for row in rdr:
for v in row[1:]:
try:
d[row[0]] += float(v)
except ValueError:
pass
print(d)
如果值可以转换为浮动,则键的值将递增,否则我们会捕获错误并继续。
输入:
a,b,c,d
1,"foo",3,""
2,5,"fuzz",12.12
3,"","bar",33.3
输出:
defaultdict(<class 'float'>, {'1': 3.0, '2': 17.119999999999997, '3': 33.3})
答案 1 :(得分:2)
看看Numpy - 它让生活变得更轻松
from numpy import genfromtxt
import numpy as np
my_data = genfromtxt('my_file.csv', delimiter=',', dtype=str)
d = {}
for i in my_data:
subset = i[1:] # create a subset to from index 1 to end
subset[subset == ''] = '0' # change all empty spaces to zero
d[i[0]] = np.sum(subset.astype(float))