Суммирование каждой пары кортежей, возвращенных CSV-файлом

Часть A: меня попросили прочитать данные из CSV-файла, который содержит 2 столбца, и вернуть данные в виде кортежа.

Часть B: Используя данные, возвращенные из CSV-файла, мне нужно было суммировать каждую пару кортежей:

из части А:

def csvReader(filename): #Function for reading .csv file
     with open(filename) as file:

          reader = csv.reader(file, delimiter=' ')
          next(reader, None)

          data = [tuple(row) for row in reader]
     return(data) 

csvReader('data.csv')

Вот что я вернул из части А:

[('60,', '20,'), ('100,', '55,'), ('50,', '40,'), ('20,', '70,'), ('95,', '85,')]

из части Б:

def Plot(filename):
     return[sum(i) for i in csvReader(filename)] #summing each pair of tuples

Plot('data.csv')

Я ожидаю что-то вроде:

[80, 155, 90, 90, 180]

И у меня ошибка типа: TypeError: неподдерживаемые типы операндов для +: 'int' и 'str'


person Hughes    schedule 28.12.2020    source источник
comment
Вам нужно преобразовать str в int   -  person Peter Wood    schedule 29.12.2020
comment
Почему вы указываете ' ' в качестве разделителя? Кажется, файл имеет разделитель ','. Ваши кортежи содержат строки (отсюда и кавычки), поэтому вам нужно интерпретировать их как целые числа с int(). Обратите внимание, что ваш выбор разделителя приводит к включению запятых в строки, вам необходимо исключить их перед использованием int()   -  person Grismar    schedule 29.12.2020


Ответы (3)


def csvReader(filename): #Function for reading .csv file
     with open(filename) as file:

          reader = csv.reader(file, delimiter=' ')
          next(reader, None)

          data = [tuple(map(int, row)) for row in reader]
     return(data) 

csvReader('data.csv')

Это должно вам помочь. Сначала преобразуйте «60» в 60 ( str в int ), а затем другая функция должна работать хорошо.

person Kaan Berke UĞURLAR    schedule 28.12.2020

Использование pandas для чтения csv и получения ваших требований.

a,b
10,20
15,5
30,40


import pandas as pd

df = pd.read_csv('data.csv', header=0)

df['sum'] = df['a'] + df['b']

tuple_requirement = tuple(zip(df['a'].to_list(), df['b'].to_list()))
sum_requirement = df['sum'].to_list()

print(sum_requirement)
print(tuple_requirement)

# [30, 20, 70]
# ((10, 20), (15, 5), (30, 40))

person KJDII    schedule 28.12.2020

Вместо того, чтобы читать CSV, а затем преобразовывать последовательности str в последовательности int, вы можете вместо этого оценить всю строку файла str. Чтобы сделать это безопасно, вы можете использовать ast.literal_eval :

>>> from ast import literal_eval
>>> literal_eval('1,2,3,4')
(1,2,3,4)

Используй это:

with open(filename) as f:
    next(f)
    rows = [literal_eval(line) for line in f]

totals = [sum(row) for row in rows]
person Peter Wood    schedule 29.12.2020