【问题标题】:Python CSV: TypeError unsupported operand "cant sum list"Python CSV:TypeError 不支持的操作数“无法求和列表”
【发布时间】:2015-10-28 03:19:19
【问题描述】:

我的代码正在返回:

Traceback (most recent call last):
  File "/Users/Justin/Desktop/Program 5/Weather_Program#5.py", line 111, in <module>
    month = sum(january)/10
TypeError: unsupported operand type(s) for +: 'int' and 'str'

我确切地知道此错误发生的位置和原因,但我不知道如何修复它。任何想法将不胜感激。

我在csv 中读取的数据是左栏中的日期和右栏中的降水。 20000101 是 2001 年 1 月 1 日,0 是 0 英寸的雨。 Na 将被排除在外,它在第二个 while 循环中正常工作。一旦我将数字转换为浮点数,我就会遇到错误

20000101    0

20000102    NA

20000103    12.2

20000104    0.3

代码:

import csv

january   = []
february  = []
march     = []
april     = []
may       = []
june      = []
july      = []
august    = []
september = []
october   = []
november  = []
december  = []

def read_cell(column, row):
    """Input x & y coordinate for CSV file: Returns information in cell"""
    with open('precipitation.csv', 'r') as f:
        reader = csv.reader(f)
        y_count = 0
        for n in reader:
            if y_count == row:
                cell = n[column]
                return cell
            y_count += 1


stormy = 0
row_number = 0

while stormy < 1:
    with open('precipitation.csv', 'r') as f:
            date = read_cell(0,row_number)
            rain = read_cell(1,row_number)
            if date == None:
                stormy += 1
                break

            elif date[4:6] == "01":
                january.append(read_cell(1,row_number))
                row_number += 1                

            elif date[4:6] == "02":
                february.append(read_cell(1,row_number))
                row_number += 1

            elif date[4:6] == "03":
                march.append(read_cell(1,row_number))
                row_number += 1

            elif date[4:6] == "04":
                april.append(read_cell(1,row_number))
                row_number += 1

            elif date[4:6] == "05":
                may.append(read_cell(1,row_number))
                row_number += 1               

            elif date[4:6] == "06":
                june.append(read_cell(1,row_number))
                row_number += 1               

            elif date[4:6] == "07":
                july.append(read_cell(1,row_number))
                row_number += 1

            elif date[4:6] == "08":
                august.append(read_cell(1,row_number))
                row_number += 1               

            elif date[4:6] == '09':
                september.append(read_cell(1,row_number))
                row_number += 1               

            elif date[4:6] == '10':
                october.append(read_cell(1,row_number))
                row_number += 1               

            elif date[4:6] == '11':
                november.append(read_cell(1,row_number))
                row_number += 1

            elif date[4:6] == '12':
                december.append(read_cell(1,row_number))
                row_number += 1

while "NA" in january:
    january.remove("NA")

    while "NA" in february:
        february.remove("NA")    

        while "NA" in march:
            march.remove("NA")    

            while "NA" in april:
                april.remove("NA")

                while "NA" in may:
                    may.remove("NA")

                    while "NA" in june:
                        june.remove("NA")

                        while "NA" in july:
                            july.remove("NA")

                            while "NA" in august:
                                august.remove("NA")

                                while "NA" in september:
                                    september.remove("NA")

                                    while "NA" in october:
                                        october.remove("NA")

                                        while "NA" in november:
                                            november.remove("NA")

                                            while "NA" in december:
                                                december.remove("NA")


january = [float(i) for i in january]
january = sum(float(january))/10
print(january)

【问题讨论】:

    标签: python string list csv type-conversion


    【解决方案1】:

    所以我认为这就是你的情况

    >>> sum([0,'NA', 12.2, 0.3])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unsupported operand type(s) for +: 'int' and 'str'
    

    您可以像这样在传递给 sum 之前过滤值。它被称为“生成器表达式”

    >>> sum(x for x in [0,'NA', 12.2, 0.3] if x != 'NA')
    12.5
    

    即。

    month = sum(x for x in january if x != 'NA')/10
    

    【讨论】:

    • 这只是列表的一个示例。我正在使用 5000 多个单元格,所以这不起作用。
    • @Wakedude,它不必是文字列表 - 任何返回序列的表达式都可以。
    • 谢谢!这为我修好了。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2014-05-23
    • 2020-12-04
    相关资源
    最近更新 更多