Написание CSV-файла в Python3 - PullRequest
0 голосов
/ 04 ноября 2018

В настоящее время я работаю над этим заданием, где я должен преобразовать это входной CSV-файл

в это записанный CSV-файл

вот мой код, который в настоящее время создает файл 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)

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

dict1 начинается пусто, и вы добавляете его только в том случае, если значение year_month уже найдено в этом пустом диктовке, чего, очевидно, никогда не будет.

Я не совсем уверен, какая логика должна быть здесь, но вам, вероятно, нужен какой-то способ установки значения по умолчанию, когда year_month не найден.

0 голосов
/ 04 ноября 2018

тест

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 для несуществующего ключа.

...