#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. Это очень помогло. Работая над новой версией, я отредактирую этот комментарий или сделаю новый, если он заработает!