2016-05-20 2 views
0

Я пишу код, который просматривал бы банковские выписки и совокупные расходы/доход в ведра в зависимости от месяца, в который они попадают. Данные находятся в форме csv и читаются как строковые записи. В файле csv есть 5 столбцов: столбец 1 для даты, 4 - для расходов и 5 для дохода.Python 3: Как суммировать результаты в словаре

Код должен:

  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  
+4

"Я ударил загвоздка". Пожалуйста, опишите более подробно проблему, которая у вас есть. Вызывает ли ваш код ошибку? Который? Где? –

+1

НЕ используйте 'float' за деньги. Используйте 'Decimal' и удаляем' '' 'делаем это:' decimal.Decimal ('$ 33.50'.replace (' $ ',' ')) ' –

+0

Уловка означает то, что я описал: невозможно суммировать столбец 4 в словаре , потому что строки не преобразуются в цифры. и никаких ошибок. Я новичок в программировании, чтобы нести со мной PLS ... – Chuck

ответ

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 
+1

Теперь вы получаете upvote! –

+1

Вы правы в отношении поплавковой вещи, слишком хлипкой за деньги ... –

+0

использовал приведенный выше код и получил эту ошибку на MS visual studio 2015: «InvalidOperation был необработанным кодом пользователя» []. он указывает на последнюю скобку. – Chuck

Смежные вопросы