Как суммировать значения в строке?

#python

Вопрос:

У меня есть файл .csv, который выглядит так:

 Word,2000,2001,2002,Total  
alpha,1,1,1  
beta,0,1,1  
charlie,0,0,1
 

Я хочу добавить общее значение в каждую строку. Пока мой код выглядит так:

 with open (myfile, 'r') as fin:
    for row in fin:
        total = []
        line = 0

        for num in row:
            if num.isdigit():
                line  = num

        total.append(line)

        with open (myfile, 'a') as fout:
            fout.write(','   total)
 

Две проблемы:

  1. Я не хочу, чтобы он рассчитывал общее количество лет в строке заголовка.
  2. Я получаю следующее сообщение об ошибке, относящееся к line = num коду:
     TypeError: unsupported operand type(s) for  =: 'int' and 'str'
     

Комментарии:

1. Вам нужно преобразовать total в строку, чтобы вы могли объединить ее: fout.write(',' str(total))

2. Заведите привычку подвергать сомнению свои предположения. Поместите print(num) в качестве первой строки for цикла, и вы увидите, что вы повторяете не поля, разделенные запятыми, а отдельные символы. Кроме того, существует разница между строкой "1" и целочисленным значением 1 , даже если "1".isdigit() оно возвращается True .

3. Если вы работаете с csv или таблицами в целом, я рекомендую проверить Pandas ( pandas.pydata.org ) для различных полезных операций с таблицами

Ответ №1:

Прежде всего, для чтения и записи CSV-файлов я рекомендую использовать модуль csv. Чтобы отделить заголовки от остальных строк, вы можете использовать встроенные функции iter и next. Вызов iter() даст вам объект итератора, а next() при однократном вызове будет получена первая строка из итератора. Затем итератор будет исчерпан циклом for. Вот пример:

 import csv

rows = []
with open('data.csv') as csv_file:
    csv_iter = iter(csv.reader(csv_file))
    rows.append(next(csv_iter))
    for row in csv_iter:
        total = sum(int(val) for val in row[1:])
        rows.append([*row, total])

with open('data.csv', 'w') as csv_file:
    csv.writer(csv_file).writerows(rows)
 

Комментарии:

1. Спасибо, это делает именно то, что я хотел.

Ответ №2:

  1. Пропустите строку заголовка, прочитав строку перед for циклом.
  2. Вам нужно разделить строку на символы, прежде чем переходить по ней. ,
  3. Вы должны преобразовать числа в целые числа, прежде чем добавлять их.
  4. Вы не можете записывать в файл, пока читаете его. Открыв его в a режиме, вы запишете итоги в конце файла, а не в конце текущей строки. Вы должны добавить в переменную, содержащую текущую строку, а затем переписать весь файл в конце.
  5. Вам нужно удалить новую строку перед добавлением в строку и добавить ее обратно при сохранении для записи позже.
  6. Вам нужно преобразовать число в строку, чтобы объединить его.

Обновленный скрипт:

 all_rows = []
with open (myfile, 'r') as fin:
    all_rows.append(myfile.readline()) # Skip header line
    for row in fin:
        row.rstrip() # remove trailing newline
        line = 0

        for num in row:
            if num.isdigit():
                line  = int(num)

        row  = ','   str(line)   'n'
        all_rows.append(row)

with open (myfile, 'w') as fout:
    fout.writelines(all_rows)
 

Ответ №3:

Попробуй это

 for row in fin:
    all_numbers = [int(x) for x in row.split(',') if x.isdigit()]
    total = str(sum(all_numbers))
 

Ответ №4:

1.У вас может быть переменная, которая является ложной при запуске, но затем становится истинной в цикле, как это:

 first==False
with open (myfile, 'r') as fin:
for row in fin:
    if not first:
        first=True
    else:
        total = []
        line = 0

        for num in row:
            if num.isdigit():
                line  = num

        total.append(line)

        with open (myfile, 'a') as fout:
            fout.write(','   total)
 

2.Элементами row являются строки. Изменение его на line =int(num) должно исправить ошибку.