python - dict -Iterite nicht durch?
dict
{"26-11-2023": {"1": {"enos": {"infinitivee": "enormous", "k": "b"}},"25-11-2023": {"1": {"enor": {"infinitivee": "enormous", "k": "b"}}}}}
code:
def read_json():
daters = []
# sefly read json file
try:
with open('German-English_wordlist.json', 'r', encoding="utf-8-sig") as f:
data = json.load(f)
except json.decoder.JSONDecodeError:
print("\033[91m[!!] File empty or anything wrong in file\033[0m", end=" - ")
print("\033[93mTry running `add` command\033[0m", end="\n")
return
except FileNotFoundError:
print("\033[91m[!!] File not found\033[0m", end=" - ")
print("\033[93mTry running `add` command to create\033[0m", end="\n")
return
except Exception:
print("\033[91m[!!]Unknown error \033[0m", end=" - ")
print("\033[93mTry to report\033[0m", end="\n")
print(Exception)
return
# check valid vocabulary daters
#KeyError: '25-11-2023'
try:
for key in data.keys():
print(data)
print(data['25-11-2023'])
print(key)
if timestamp >= int(datetime.datetime.strptime(key, '%d-%m-%Y').strftime("%s")) and timestamp != "---":
daters.append(key)
except UnboundLocalError:
print("\033[91m[!!] File empty or anything wrong in file\033[0m", end=" - ")
print("\033[93mTry running `add` command\033[0m", end="\n")
return
# if not a dater in then print finish and break else choice random on of them
print(daters)
try:
dater = random.choice(daters)
except IndexError:
print("\033[93mFinish\033[0m\n")
return
queried = [key for key in data[dater].keys()]
queried = random.choice(queried)
keys = [key for key in data[dater][queried].keys()]
key = random.choice(keys)
forms = [key for key in data[dater][queried][key].keys()]
# depending on the mode asking for the form of the word
if False:
form = random.choice(forms)
else:
form = "infinitivee"
value = data[dater][queried][key][form]
return data, dater, queried, key, form, value
output:
{'26-11-2023': {'1': {'enos': {'infinitivee': 'enormous', 'k': 'b'}}, '25-11-2023': {'1': {'enor': {'infinitivee': 'enormous', 'k': 'b'}}}}}
Traceback (most recent call last):
File "/media/deffer/User_data/Tools/vokabularis/vokabularis.py", line 135, in <module>
data, choused_dater, queried, key, form, value = read_json()
File "/media/deffer/User_data/Tools/vokabularis/vokabularis.py", line 44, in read_json
print(data['25-11-2023'])
KeyError: '25-11-2023'
Wenn ich mein dictionary zum volgendem andere, funktioniert alles.
{"25-11-2023": {"1": {"enor": {"infinitivee": "enormous", "k": "b"}}}, "26-11-2023": {"1": {"enos": {"infinitivee": "enormous", "k": "b"}}}}
code:
ist der selbe wie davor
Output:
Successed
2 Antworten
Schau dir dein JSON einmal formatiert (mit Einrückungen) an (bspw. mit diesem Online-Formatter). Die Strukturen deiner JSONs unterscheiden sich. Im ersteren Fall ist 25-11-2023 ein Untereintrag im 26-11-2023-Objekt, im zweiteren Fall ist es gleichrangig.
ungeachtet Deines Pythoncodes, stellt dein JSON kein legitimes Object dar.
Da kannst Du noch so am Decoder rumbasteln, wenn das JSON den falschen Aufbau hat kann der Decoder daraus kein plausibles Object konstruieren.
Problem:
"enor":{
"infinitivee":"enormous",
"k":"b"
}
...die Property "enor" soll mehrere Eigenschaften binden, wird jedoch nicht als Array ausgewiesen.
richtig:
"enor":[
{"infinitivee":"enormous"},
{"k":"b"}
]
unterschiedliche Properties in verschiedenen? Instanzen des gleichen (Sub)Objects. (das ist zwar legitim, sollte jedoch lediglich bei einem impliziten value-Array verwendet werden.)
- "1":{ "enos":[
- "1":{ "enor":[
so wäre der richtige Aufbau (vereinfacht):
[
{
"25-11-2023":{
"1":{
"enor":[
{"infinitivee":"enormous"},
{"k":"b"}
]
}
}
},
{
"26-11-2023":{
"1":{
"enor":[
{"infinitivee":"enormous"},
{"k":"b"}
]
}
}
}
]
compressed:
[{"25-11-2023":{"1":{"enor":[{"infinitivee":"enormous"},{"k":"b"}]}}},{"26-11-2023":{"1":{"enor":[{"infinitivee":"enormous"},{"k":"b"}]}}}]
vollständig compressed:
{"value":[{"25-11-2023":{"1":{"enor":[{"infinitivee":"enormous"},{"k":"b"}]}}},{"26-11-2023":{"1":{"enor":[{"infinitivee":"enormous"},{"k":"b"}]}}}],"Count":2}
Wie?
Also im Online-Formatter ist es identisch
mit dem was pycharm ausgibt, wenn ich auf Reformat drucke.