我目前正在处理此作业,我必须将其转换为 input csv file
变成这个 written csv file
这是我的代码,当前正在我的文件夹中创建csv文件,但实际上并未在其中写入任何内容。
import csv
def read_calculate():
dict1 = {}
with open('sunspots.csv','r') as file:
csv_reader = csv.reader(file, delimiter=',')
for row in csv_reader:
year_month = row[0] + row[1]
if year_month in dict1:
if(row[4].isnumeric() and int(row[4])!= -1):
dict1[year_month]+= int(row[4])
else:
if(row[4].isnumeric() and int(row[4])!=-1):
dict1[year_month]=int(row[4])
else:
dict1[year_month]=0
file.close()
return dict1
def write_to_file(dict1):
with open('Monthtotal.csv','w',newline='') as write_file:
writer = csv.writer(write_file)
for key in dict1.keys():
line = key[0:4],k[4:6],str(dict1[key])
writer.writerow(line)
write_file.close()
if __name__=='__main__':
dict1 = read_calculate()
write_to_file(dict1)
答案 0 :(得分:2)
测试
if year_month in dict1:
“保护” dict1
在读取文件时不会被更新。因此,当您写入文件时,您不会获得任何数据。
我想你想让其他部分缩进去
if year_month in dict1:
if(row[4].isnumeric() and int(row[4])!= -1):
dict1[year_month]+= int(row[4])
else:
if(row[4].isnumeric() and int(row[4])!=-1):
dict1[year_month]=int(row[4])
else:
dict1[year_month]=0
但是有更聪明的方法,例如collections.Counter
:
import collections
dict1 = collections.Counter()
然后在循环中,只需进行一次测试即可确保数据为数字,然后:
if(row[4].isnumeric() and int(row[4])!= -1):
dict1[year_month] += int(row[4])
else:
dict1[year_month] += 0 # add nothing, but "creates" the key if doesn't exist
您需要else
部分(看起来很笨拙,是的,我知道),因此您需要创建所有的月份密钥,即使是空的也是如此,否则您的csv文件将存在漏洞。另一种选择是在编写字典时不循环键(字典在python 3.6之前不排序),而是在硬编码的月份值上循环。 Counter
将在不存在的密钥上产生0。
答案 1 :(得分:0)
dict1
开始为空,并且只有在该空字典中已经找到year_month值的情况下,您才添加到该值中,显然不会。
我不太确定应该在这里讲什么逻辑,但是大概在找不到year_month时,您可能需要某种方式来设置默认值。