Добавьте все строки в столбце и отобразите его в конце файла. - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь добавить все строки в столбце и отобразить вывод в одной строке. Вот мой исходный код:

csvio = StringIO()
header = ['Name','Unit1','Unit2','Marks']
writer = csv.writer(csvio)
writer.writerow(header)

for ut in uts:
    data = marks_helper()
    tot = 0
    row = []

    if data['a'] > 0.01 or data['b'] > .01 or data['a'] > .01:
        row.append(ut.name)
        row.append(round(data['a'],1))
        row.append(round(data['abd'], 1))
        tot = Decimal(data['abd']) - Decimal(data['a'])
        row.append("{}".format('%.2f' % tot))                      

    if len(row) >= 1:
        writer.writerow(row)               

local = open( 'filename' , 'w')
local.write(csvio.getvalue())
local.close()  

csvio.seek(0)
breakdown = csvio.getvalue()

Я пытаюсь получить сумму всех строк в столбце «Метки» и отобразить ее в новой строке. Я пробовал это:

for x in tot:
    x += int(row[3])
    row.append(x)

, но я получаю эту ошибку:

'Decimal' object is not iterable

1 Ответ

1 голос
/ 29 марта 2020

Эта строка делает tot десятичным объектом:

tot = Decimal(data['abd']) - Decimal(data['a'])

Это означает, что его число, например, int или float, не повторяется.

# This code, with tot being a Decimal ...
for x in tot:
    pass

# ... is the equivalent of this
for x in 1:
    pass

# ... or this
for x in 0.1:
    pass

Вероятно, вам нужно:

# Before looping over uts
marks_total = Decimal()

for ut in uts:
    # ... after calculating tot
    marks_total += tot  # Accumulate total of all tot

# After loop
writer.writerow(['', '', '', marks_total])

Если вы хотите перебрать список, вы можете сделать это, но это медленнее и бессмысленно:

# Before loop
all_tots = []

for ut in uts:
    # ... after calculating tot
    all_tots.append(tot)

# After loop
writer.writerow(['', '', '', sum(all_tots)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...