我的代码正在返回:
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)
答案 0 :(得分:0)
您是否认为问题可能出在输入文件中? 其他可能性:月份中的前导零可能是问题。
您会考虑使用熊猫的数据框吗?您可以过滤以获取月份并将每月结果存储到每个月的数据框中
CSV文件很容易导入到数据框中。如果您需要更多帮助,我会给它
答案 1 :(得分:0)
您正在打开两次CSV
每次阅读单元格时,您都要重新扫描整个CSV文件
第55行的例外符合您的源代码
您没有处理空行/单元格。在while循环的顶部,您需要:
typedef int(__stdcall *__MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT);
答案 2 :(得分:0)
while
循环中唯一的停止条件是if date[0:] == None
。这意味着您的循环将继续,直到某个时刻该文件没有另一行,此时date
和rain
将设置为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循环在第一行之后停止,而不是循环遍历整个文件。在我的测试中,我将其更改为单行间隔,因为这可能是实际文件。