У меня эта ошибка, и я не знаю, что делать

#python

#python

Вопрос:

 def Reset():
        data = []
        data.append({
            'year': now.year,
            'months': []
        })
        for year in range(len(data)):
            for month in range(12):
                data[year].months.append({
                    'month': (month   1),
                    'days': []
                })
                if (month 1 == 2):
                    daysAmount = 28
                    if (isinstance(year/4, int)):
                        daysAmount = 29
                elif (month 1 == 12):
                    daysAmount = 31
                elif (isinstance((month 1)/2, int)):
                    daysAmount = 30
                else:
                    daysAmount = 31
                for day in range(daysAmount):
                    data[year].months[month].days.append({
                        'day': (day   1),
                    })
        with open('./data.txt', 'w') as outfile:
            json.dump(data, outfile)
    
    
    
    Reset()
 

Я изменил код, но теперь появилась другая ошибка, которую я не понимаю. Что мне делать с этим? Как вы можете видеть, у него есть атрибут months …

 line 13, in Reset
    data[year].months.append({
AttributeError: 'dict' object has no attribute 'months'
 

Комментарии:

1. Сообщение об ошибке сообщает вам, что len(data) это число, а не то, что вы можете повторить. Вы имели в виду for year in data ?

2. используйте for _ in range(len(var)):

3. Пожалуйста, не редактируйте свой вопрос, чтобы полностью удалить сам исходный вопрос и задать новый / последующий вопрос. (Я вижу, что вы также попросили ответчика дать разъяснения в комментариях, и он их отсортировал.)

Ответ №1:

Да, есть способ получить количество элементов в списке данных вместо фактических объектов в переменной ‘year’, и для этого вы должны использовать

 for year in range(len(data)): 
 

следующим образом

 import json
import datetime
now = datetime.datetime.now()

def Reset():
    data = []
    data.append({
        'year': now.year,
        'months': []
    })
    for year in range(len(data)):
        for month in range(12):
            data[year]['months'].append({
                'month': (month   1),
                'days': []
            })
            if (month 1 == 2):
                daysAmount = 28
                if (isinstance(year/4, int)):
                    daysAmount = 29
            elif (month 1 == 12):
                daysAmount = 31
            elif (isinstance((month 1)/2, int)):
                daysAmount = 30
            else:
                daysAmount = 31
            for day in range(daysAmount):
                data[year]['months'][month].days.append({
                    'day': (day   1),
                })
    with open('./data.txt', 'w') as outfile:
        json.dump(data, outfile)



Reset()
 

Другим способом было бы использовать

 for year in data:
 

следующим образом

 import json
import datetime
now = datetime.datetime.now()

def Reset():
    data = []
    data.append({
        'year': now.year,
        'months': []
    })
    for year in data:
        for month in range(12):
            year['months'].append({
                'month': (month   1),
                'days': []
            })
            if (month 1 == 2):
                daysAmount = 28
                if (isinstance(year/4, int)):
                    daysAmount = 29
            elif (month 1 == 12):
                daysAmount = 31
            elif (isinstance((month 1)/2, int)):
                daysAmount = 30
            else:
                daysAmount = 31
            for day in range(daysAmount):
                year['months'][month].days.append({
                    'day': (day   1),
                })
    with open('./data.txt', 'w') as outfile:
        json.dump(data, outfile)

Reset()
 

Комментарии:

1. Я попробовал это и получил сообщение об ошибке, см. Сообщение выше.

2. Да, но мне нужен верхний пример, потому что далее в коде мне нужна переменная year как число для некоторых математических уравнений. Однако первая ошибка. я изменил основной вопрос.

3. Понял. Python Dicts — это не то же самое, что JavaScript Dicts. Нам нужно получить доступ к месяцам как data[year]['months'] , а не как data[year].months .

4. Секундочку. Редактирование

5. Внес эти изменения!

Ответ №2:

Функция len() возвращает целое число.

 for x in y:
 

y здесь должен быть список или что-то итеративное, а не целое число

используя len(data) ваш просто возвращает длину списка

вы должны использовать

 for year in data:
 

Ответ №3:

когда вы выполняете len(data), он возвращает целое число, которое не может быть повторено;

следовательно, вы должны сделать что-то вроде:

 for year in range(len(data)) 
 

или

 for item in data.item:
     year = item['year'] 
     ...
 

Ответ №4:

Вы получаете сообщение об ошибке, потому что вы из этой строки

 for year in len(data):
 

Этот len(data) возвращает целое число, и это невозможно повторить.

Вместо этого вы можете сделать это

 for item in data:
    year = item['year']
 

или

 for index in range(len(data)):
    item = data[index]
 

Комментарии:

1. Это то, что мне было нужно, спасибо!