1

我正在解析一个 csv 文件,其中第一行是标题。我想根据日期对金额列求和,但收到一条错误消息。为了调试,我正在根据错误消息检查该列是否是数字以及它是否是字符串 - 两者都是。这可能是什么原因?

def parseDataFromFile(self,f):
    fh = open(f,'r')
    s = 0
    for line in fh:
        #parsing the line according to comma and stripping the '\n' char
        year,month,day,amount = line.strip('\n').split(',')

        #checking the header row, could check if was first row as well - would be faster
        if (amount == "Amount"): continue

        #just for the debug checks
        #here is the question

        if isinstance(amount,str):
            print "amount is a string"
            #continue
        if amount.isdigit:
            print "amount is a digit"

        #sum on the amount column
        s = s + amount

输出:amount是一个字符串amount是一个数字amount是一个字符串amount是一个数字

错误:

s = s + amount 
TypeError: unsupported operand type(s) for +: 'int' and 'str'
4

4 回答 4

5

你的问题是它s是一个整数,你将它初始化为0. 然后你尝试向它添加一个字符串。amount始终是一个字符串。您无需将类似数字的数据转换为实际数字,它始终是一个字符串。

如果您希望数量是一个数字,请使用:

s += float(amount)

PS:您应该使用csvstdlib 中的模块来读取 CSV 文件。

于 2012-07-17T14:21:08.653 回答
1
if amount.isdigit:
    print "amount is a digit"

将始终打印“金额是数字”,因为您没有调用该方法(应该是if amount.isdigit():)。

您可以确定通过从 CSV 文件中拆分一行获得的任何字段都是字符串,您需要先将其转换为 int:

s = s + int(amount)
于 2012-07-17T14:21:42.130 回答
0

s 是一个 int,而 amount 是一个数字的字符串表示,所以更改s = s + amounts += int(amount)

于 2012-07-17T14:21:15.053 回答
0

像?:(假设列标题是“年”、“月”、“日”、“金额”)

from collections import defaultdict
import csv

sum_by_ym = defaultdict(float)
with open('input_file.csv') as f:
    for row in csv.DictReader(f):
        sum_by_ym[(row['Year'], row['Month'])] += int(float['Amount'])

print sum_by_ym
于 2012-07-17T14:34:26.953 回答