Python CSV:读取文件时出现NoneType错误

时间:2015-10-27 20:40:40

标签: python csv indexing while-loop typeerror

我的代码正在返回:

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)

5 个答案:

答案 0 :(得分:0)

您是否认为问题可能出在输入文件中? 其他可能性:月份中的前导零可能是问题。

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

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

答案 1 :(得分:0)

  1. 您正在打开两次CSV

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

  3. 第55行的例外符合您的源代码

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

    typedef int(__stdcall *__MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT); 
    

答案 2 :(得分:0)

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

请尝试if date == None

答案 3 :(得分:0)

根据我对csv文件的处理,open需要

导入csv

使用open('names.csv',encoding ='utf-8')作为csvfile:...  reader = csv.DictReader(csvfile)...    读者行: 它可能是你的解码

答案 4 :(得分:0)

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

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

(这假设这些是CSV文件中的选项卡。如果它们是空格,则分隔符必须为delimiter=' ',这更加困难,因为结果将在第4列中结束。

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

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

相关问题