Python:如何计算 csv 上的浮点数总和

Python: How to calculate sum of floats on csv

我开始学习 Python。如何计算 csv 文件中特定列的总和(浮点数)?

这是我到目前为止所做的,但我的代码没有给出 'amount'(列)的总数:

giftFile = open('input.v0.small.csv')
giftReader = csv.reader(giftFile)
giftData = list(giftReader)

for row in giftReader:
    if len(row)>0:
        giftData += row['amount']

print('row 0:' + str(giftData[0]))
print("row 1's dollar value: " + str(giftData[1]))

来自 csv 文件的样本:

date,amount,vendor,not sure,who,category
3/11/17, 100.00,"99 PLEDGCharlie S 99PLEDGES.COMAZ",2,Bob Smith,charity
3/11/17, 3.27,"CAFE BEARYUM ORO VALLEY AZ"

您可以使用 sum 轻松完成此操作。 csv.reader returns 一个为每一行提供一个列表的迭代器,所以我们只需要挑选出正确的列元素,转换为浮点数,然后将它们全部相加。此示例在对浮点数求和时使用 Decimal 给出 'expected' 结果,但如果您愿意,可以使用 float 代替:

import csv
from decimal import Decimal

col = 1

with open('input.v0.small.csv') as giftFile:
    reader = csv.reader(giftFile)
    header = next(reader)
    print(sum(Decimal(x[col]) for x in reader if x[col]))

只需将col更改为要处理的列数。

在 Python 中打开文件时,应该关闭文件。为避免忘记关闭,请使用上下文管理器。在以列表列表的形式读入数据后,您可以使用列表推导式从指定列中提取数据。然后,使用sum内置函数进行最后的求和。

from csv import reader

# context manager for reading-in CSV file 
with open('input.v0.small.csv', 'r') as read_obj:
    csv_reader = reader(read_obj)
    data = list(csv_reader)

# list comprehension to extract specified column
ls = [float(row[1]) for row in data[1:]] 

# built-in sum function
column_sum = sum(ls)

# print result
print(f'Column sum is {column_sum}')

你可以试试:

import csv
from math import fsum

with open('input.v0.small.csv', 'r') as file:
    result = fsum(
        float(d['amount']) if d['amount'].strip() else 0
        for d in csv.DictReader(file) if d['amount']
    )
  • 假设:csv-file 包含 header 行,您要汇总的列名为 amount.
  • 使用 DictReader 而不是 reader 以便能够按列名获取金额。
  • 使用 fsum 而不是 sum 以避免精度损失。

文件结果

date,amount,vendor,not sure,who,category
3/11/17, 100.00,"99 PLEDGCharlie S 99PLEDGES.COMAZ",2,Bob Smith,charity
3/11/17, 3.27,"CAFE BEARYUM ORO VALLEY AZ"

103.27

文件结果

date,amount,vendor,not sure,who,category
3/11/17, 100.00,"99 PLEDGCharlie S 99PLEDGES.COMAZ",2,Bob Smith,charity


3/11/17, 3.27,"CAFE BEARYUM ORO VALLEY AZ"

103.27