【问题标题】:Python CSV: NoneType error while reading filePython CSV:读取文件时出现 NoneType 错误
【发布时间】:2015-10-27 20:40:40
【问题描述】:

我的代码正在返回:

Traceback (most recent call last):
  File "/Users/Justin/Desktop/Program 5/Weather_Program#5.py", line 55, in <module>
    if date[0:] == None:
TypeError: 'NoneType' object is not subscriptable

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

我在csv 中读取的数据是左栏中的日期和右栏中的降水。 20000101 表示 2001 年 1 月 1 日,0 表示 0 英寸的降雨。

20000101    0

20000102    0

20000103    0

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[0:] == 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               


print(january)

【问题讨论】:

    标签: python csv indexing while-loop typeerror


    【解决方案1】:

    while 循环上的唯一停止条件是if date[0:] == None。这意味着您的循环将继续,直到文件没有另一行,此时daterain 将设置为None。此时,在停止条件下,您正在尝试执行None[0:],这就是引发错误的原因。

    改用if date == None

    【讨论】:

    • 如果它解决了您的问题,请接受答案。 :)
    【解决方案2】:

    您是否考虑过问题可能出在输入文件中? 其他可能性:几个月中的前导零可能是问题。

    您会考虑使用熊猫的数据框吗?您可以过滤以获取月份并将这些每月结果存储到每个月的数据框中

    CSV 文件很容易导入数据框。如果您需要更多帮助,我会提供帮助

    【讨论】:

    • 当程序遍历文件并在最后命中一个空单元格时会出现问题。我已经编码了大约 4 个月,从未使用过熊猫的数据框。我该怎么做呢。
    • import pandas as pd import df = pd.read_csv('precipitation.csv') print df
    【解决方案3】:
    1. 您打开 CSV 两次

    2. 每次读取单元格时,都会重新扫描整个 CSV 文件

    3. 第 55 行的异常与您的源代码匹配

    4. 您没有处理空行/单元格。在您的 while 循环顶部,您需要:

      if date is None:
          continue
      

    【讨论】:

      【解决方案4】:

      从我对 csv 文件的处理来看,需要打开

      导入 csv

      使用 open('names.csv',encoding='utf-8') 作为 csvfile: ... 阅读器 = csv.DictReader(csvfile) ... 对于阅读器中的行: 可能是你的解码

      【讨论】:

        【解决方案5】:

        the docs 看来,默认分隔符是逗号。在我这样打开阅读器之前,您的代码对我不起作用:

        reader = csv.reader(f, delimiter='\t')
        

        (假设这些是 CSV 文件中的制表符。如果它们是空格,则分隔符需要为 delimiter=' ',这更难,因为结果将在第 4 列中结束)。

        我也同意你应该检查if date is None。但是我认为您还应该在read_cell() 的末尾明确返回None,因为它是从那里来的。

        还有一件事:从您的问题看来,CSV 文件是双倍行距的。这对我不起作用—— for 循环在第一行之后停止,而不是循环遍历整个文件。在我的测试中,我将其更改为单行距,因为这可能是实际文件的内容。

        【讨论】:

          猜你喜欢
          • 2015-08-10
          • 2020-01-29
          • 1970-01-01
          • 2018-10-30
          • 1970-01-01
          • 1970-01-01
          • 2019-04-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多