Добавление вложенных словарей в уже существующий файл JSON со словарем

#python #json #dictionary

#python #json #словарь

Вопрос:

Недавно я начал изучать python. После завершения всех learnpython.org учебные пособия Я пробую что-то самостоятельно (чтобы вы знали мой уровень знаний).

Я хочу создать небольшой скрипт, который позволит вам создать символ DnD и сохранить его в файле. Идея заключалась в том, чтобы использовать JSON (поскольку он был включен в учебные пособия по learnpython) и вставлять словари в соответствии с:

data = { playerName ; {"Character Name" : characterName, "Character Class" : characterClass...ect.}}

Я надеялся, что можно добавить новые dic в файл JSON внутри этого исходного dic данных, поэтому словарь представляет собой список имен игроков, под которыми есть символьные dic.

Я не только не смог получить его точно так, как это, я также не смог просто добавить следующие словари, не сделав файл нечитаемым. Вот мой код, поскольку он не очень длинный:

 import json


def dataCollection():
    print("Please write your character name:")
    characterName = input()
    print("%s, a good name! nNow tell me your race:" % characterName)
    characterRace = input()
    print("And what about the class?")
    characterClass = input()
    print("Ok so we have; nName = %s nRace = %s nClass = %s nPlease tell me the player name now:" % (characterName, characterRace, characterClass))
    playerName = input()
    print("Nice to meet you %s. nI will now save your choices..." % playerName)
    localData = { playerName : 
                 {"Character Name" : characterName,
                  "Character Class" : characterClass,
                  "Character Race" : characterRace}}

    with open("%s_data_file.json" % playerName, "a") as write_file:
        json.dump(localData, write_file)
        
    


dataCollection()

with open("data_file.json", "r") as read_file:
    data = json.load(read_file)
# different .json name here since I'm trying around with different files

print(data)

  

Редактировать: также может быть возможно, что JSON не является «правильной» вещью для моей идеи. Если у вас есть какие-либо альтернативные идеи для хранения этой информации (помимо прямого файла txt), не стесняйтесь предлагать их!

Ответ №1:

я внес небольшие изменения, я пытаюсь прочитать файл для инициализации данных json, если это не удается, я инициализирую данные.

 import json


def createPlayer():
    print("Please write your character name : ")
    characterName = input()
    print("%s, a good name! nNow tell me your race : " % characterName)
    characterRace = input()
    print("Nice to meet you %s. nI will now save your choices..." % characterName)

    try :
        with open('data_file.json') as json_file:
            data = json.load(json_file)
    except :
        data = {}
        data['player'] = []

    data['player'].append({
    'name': characterName,
    'race': characterRace,
    })

    with open("data_file.json", "w ") as write_file:
        json.dump(data, write_file)

createPlayer()

with open("data_file.json", "r") as read_file:
    data = json.load(read_file)

print(data)
  

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

1. Traceback (most recent call last): File "C:UsersAzubi-elsourcereposstuff.py", line 26, in <module> createPlayer() File "C:UsersAzubi-elsourcereposstuff.py", line 18, in createPlayer data['player'].append({ KeyError: 'player'

Ответ №2:

Я думаю, что то, как вы думаете о словаре, может быть не совсем тем, что есть. Словарь — это структура данных, которая может содержать множество пар ключ-значение.

Здесь ключом к вашему словарю будет имя игрока, а значением будет словарь, содержащий имя, класс и расу персонажа.

Таким образом, файл json, содержащий словарь, не может быть добавлен, поскольку файл json может содержать только 1 объект json.

 { 'playerName': {...character's attributes...}}
  

Если бы вы открыли файл и добавили объект json (как вы делаете в конце dataCollection ), то ваш файл был бы таким

 { 'playerName':
    {...characters attributes...}
}
{ 'playerName2':
    {...characters attributes...}
}
  

И при чтении файл json остановится, когда закончится первый найденный объект json. Таким образом, он не будет загружать 2-й словарь.

Если вы хотите добавить что-то в словарь внутри вашего файла json, вам нужно загрузить файл json для доступа к словарю, а затем добавить новую пару ключ-значение, а затем сбросить этот новый словарь. Что приведет к следующему файлу json:

 { 'playerName':
    {...characters attributes...},
  'playerName2':
    {...characters attributes...}
}
  

Надеюсь, это понятно.

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

1. Это очень помогло. Работая над новой версией, я отредактирую этот комментарий или сделаю новый, если он заработает!