【问题标题】:Python 3: How to sum results into a dictionaryPython 3:如何将结果汇总到字典中
【发布时间】:2016-09-17 18:47:00
【问题描述】:

我正在编写一个代码,它会查看银行对账单并根据它们所在的月份将费用/收入汇总到存储桶中。数据为 csv 格式,并以字符串条目的形式读取。 csv 文件有 5 列:第 1 列是日期,4 列是费用,5 列是收入。

代码应该:

  1. 在 csv 的日期字符串中查找月份。
  2. 将费用/收入添加到相应的字典中。

我在尝试将费用(格式:“$0.00”)转换为浮点数并将它们汇总到字典中时遇到了麻烦。谁能告诉我在这里我能做什么?

代码如下:

import numpy as np
import csv
import timestring as ts


months= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
expenses = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0}
income = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0}
exp_cat = []
income_cat = []

files =['export.csv', 'export1.csv']

with open("budgetfile.csv","wt") as fw:
    writer = csv.writer(fw)
    for file in files:
        with open(file) as csvfile:
            records = csv.reader(csvfile, quoting=csv.QUOTE_NONE)
            print("Processing file {}. \n" .format(file))
            header = next(records)
            for row in records:
                try:
                    expenses[ts.Date(row[0]).month] += float(row[4])
                    income[ts.Date(row[0]).month] += float(row[5])
                    break
                except ValueError:
                    pass    

【问题讨论】:

  • “我遇到了障碍”。请更详细地描述您遇到的问题。你的代码会抛出错误吗?哪一个?在哪里?
  • 不要使用float 来赚钱。使用Decimal 并删除$s 这样做:decimal.Decimal('$ 33.50'.replace('$', ''))
  • 障碍的意思是我所描述的:不能将第 4 列加到字典中,因为字符串不会转换为数字。并且没有错误。我是编程新手,请耐心等待...
  • 我得到十进制。用户代码未处理 InvalidOperation 消息:[] 当我尝试使用 decimal.Decimal (row[4].replace('$' , ''))。 row[4] 中的负数用括号表示。会不会是因为这个?我也可以使用替换方法替换多个字符吗?怎么样?

标签: python string csv dictionary sum


【解决方案1】:

试试这个

import numpy as np
import csv
import timestring as ts
import decimal
from collections import defaultdict


months= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
expenses = defaultdict(decimal.Decimal)
income = defaultdict(decimal.Decimal)
'''Optional for less imports
expenses = {x:decimal.Decimal() for x in months}
income = {x:decimal.Decimal() for x in months}
'''
exp_cat = []
income_cat = []

files =['export.csv', 'export1.csv']

with open("budgetfile.csv","wt") as fw:
    writer = csv.writer(fw)
    for file in files:
        with open(file) as csvfile:
            records = csv.reader(csvfile, quoting=csv.QUOTE_NONE)
            print("Processing file {}. \n" .format(file))
            header = next(records)
            for row in records:
                try:
                    expenses[ts.Date(row[0]).month] += decimal.Decimal(row[4].replace('$', ''))
                    income[ts.Date(row[0]).month] += decimal.Decimal(row[5].replace('$', ''))
                    break
                except ValueError:
                    pass 

【讨论】:

  • 使用上面的代码并在 MS Visual Studio 2015 上收到此错误:“用户代码未处理 InvalidOperation”[]。它指向最后一个括号。
  • @Chuck 我刚刚提交了一个编辑,给它10-20分钟让大家接受它,你应该看到它
  • @Uzzee 更少的导入比更多的代码更好,比我聪明得多的人说:“我讨厌代码,我尝试尽可能多地删除它”——释义。我的观点是:欢迎导入,并尝试真的不要自己编写任何代码。您拥有的代码越多,破坏某些东西的风险就越大,导入(特别是来自 stdlib 的那些)是惊人的! :P
  • @JavierBuzzi 好吧,是的!但是,如果您可以只使用理解而不是导入,它实际上可能更短(因为在这种情况下它是相同的)。如果您使用大量文件进行构建,学习不要到处导入所有内容也很好。
  • @JavierBuzzi- 我尝试使用上述更正运行代码。它仍然会引发相同的错误。我导入了十进制并使用了标记为可选的代码部分。它没有用。我的导入如下所示: from decimal import Decimal, DecimalException from collections import defaultdict months= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 费用 = defaultdict(Decimal) 收入= defaultdict(十进制)
猜你喜欢
  • 2016-01-26
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2013-11-14
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多