【问题标题】:Summing each pair of tuples which returned by the a csv file对 csv 文件返回的每对元组求和
【发布时间】:2020-12-30 00:32:45
【问题描述】:

A 部分:我被要求从包含 2 列的 csv 文件中读取数据,并以元组的形式返回数据。

B 部分:使用从 csv 文件返回的数据,我需要对每对元组求和:

来自 A 部分:

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')

这是我从 A 部分返回的内容:

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

来自 B 部分:

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: unsupported operand type(s) for +: 'int' and 'str'

【问题讨论】:

  • 你需要将 str 转换为 int
  • 为什么要指定' ' 作为分隔符?该文件似乎是',' 分隔的。您的元组包含字符串(因此是引号),因此您需要使用int() 将它们解释为整数。请注意,您选择的分隔符会导致字符串中包含逗号,您需要在使用 int() 之前排除这些分隔符

标签: python csv


【解决方案1】:
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 ),然后其他函数应该可以正常工作。

【讨论】:

    【解决方案2】:

    使用 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))
    
    

    【讨论】:

      【解决方案3】:

      与其读取 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 2021-12-02
        • 1970-01-01
        • 2016-01-14
        相关资源
        最近更新 更多