json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Huhu :)
ich habe einen ganzen Ordner voller .jsons... Nur unterscheiden sich diese Jsons minimal.. Ich wollte nun eine Liste erstellen welche die Schlüssel in den Jsondateien sammelt und mir danach ausgibt. Quasi:

Code: Alles auswählen

# erste Datei:
{erster_schluessel : 123, zweiter_schluessel: 234}
# zweite datei
{dritter_schluessel : 213, vierter_schluessel : 242]

Schluessel = [erster_schluessel, zweiter_schluessel, dritter_schluessel, vierter_schluessel]
Einfach fürs verständniss, was mein Ziel ist.

Nun habe ich mir folgenden Code zusammengebastelt:

Code: Alles auswählen

import os
import json


dir = "C:/Users/pasqu/Desktop/data/text/current"

for file in os.listdir(dir):
    if file.endswith(".json"):
        data = json.loads(file)
        print(data)
Bekomme aber einen JSONDecodeError (im Titel)
Ich habe schon gegoogelt, aber bisher keine Brauchbare lösung gefunden im Maßstab von meinem Code... Also von der "Einfachheit" des Codes..

Was muss ich tun, damit die Variable "data" die JSON beinhaltet (innerhalb der schleife)...
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

EDIT:
Okay.. Habe jetzt herausgedunden, dass die Variable file nicht die Datei selber ist, sondern nur der Dateiname...
Also kam ich auf diese Idee hier:

Code: Alles auswählen

        with open(str("C:/Users/pasqu/Desktop/data/text/current/" + str(file))) as json_file:
            data = json.load(json_file)
            print(data)
bekomme hier aber auch wieder diese Fehlermeldung:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Wenn ich aber in die Datei selber reinschaue, sehe ich, dass die Json so aussieht:

Code: Alles auswählen

{'coord': {'lon': 8.7, 'lat': 47.8},
'weather': [{'id': 600, 'main': 'Snow', 'description': 'light snow', 'icon': '13n'}],
'base': 'stations',
'main': {'temp': 0.83, 'feels_like': -1.54, 'temp_min': -0.56, 'temp_max': 1.67, 'pressure': 1015, 'humidity': 91},
'visibility': 10000,
'wind': {'speed': 0.45, 'deg': 193, 'gust': 0.89},
'snow': {'1h': 0.13},
'clouds': {'all': 100},
'dt': 1608866701,
'sys': {'type': 3, 'id': 2034101, 'country': 'CH', 'sunrise': 1608880391, 'sunset': 1608910650},
'timezone': 3600, 'id': 6695941, 'name': 'Thayngen, Altdorf', 'cod': 200}
also für mich sieht das alles richtig aus...

Edit während ich gerade schreibe:
Och nööö... in der Datei sind alles normale quotes und keine doubble quotes.. hab jetzt diese eine Datei manuell geändert...
mal schauen obs funktioniert..
okay.. jetzt funktionierts...

Ich bekomm die Krise :D Wieso wird mir eine Json mit single-quotes geliefert...

Naja... jetzt darf ich herausfinden, wie ich aus den ganzen Single-quotes double quotes machen darf ^^

Ursprüngliches Problem gelöst.
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Boom... Kaum sind die Error gelöst, funzt alles :D

Code: Alles auswählen

import os
import json
import urllib.request

DIR = "C:/Users/pasqu/Desktop/data/text/current"
key_list = []

for file in os.listdir(DIR):
    if file.endswith(".json"):
        with open(str("C:/Users/pasqu/Desktop/data/text/current/" + str(file))) as json_file:
            data = json.load(json_file)
            for key in data:
                if key not in key_list:
                    key_list.append(key)

print(key_list)

Ausgabe:
['coord', 'weather', 'base', 'main', 'visibility', 'wind', 'snow', 'clouds', 'dt', 'sys', 'timezone', 'id', 'name', 'cod', 'rain']
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mr. R341: `urllib.request` wird importiert, aber nirgends verwendet.

Pfadteile mit ``+`` zusammensetzen ist kaputt. Es gibt für Operationen auf/mit Pfaden das `pathlib`-Modul.

Beide `str()`-Aufrufe machen überhaupt keinen Sinn.

`file` ist keine Datei, sondern ein Datei*name*, sollte also `filename` heissen. Wenn man denn mit Zeichenketten arbeiten müsste.

Grunddatentypen haben nichts in Namen verloren. Man ändert den Typen ab und zu mal zu einem anderen/eigenen/passenderen Typen, die Bedeutung bleibt aber gleich, und man muss dann trotzdem die betroffenen Namen überall ändern, oder hat falsche, irreführende Namen im Programm. `key_list` sollte beispielsweise eher eine Menge (`set`) sein und keine Liste.

Bei Textdateien sollte man immer explizit eine Kodierung angeben beim öffnen. Für JSON wäre das in der Regel UTF-8. Besser ist es allerdings das dem `json`-Modul zu überlassen und die Datei im Binärmodus zu öffnen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import json
from pathlib import Path


def main():
    directory_path = Path("C:/Users/pasqu/Desktop/data/text/current")
    keys = set()
    for file_path in directory_path.glob("*.json"):
        with file_path.open("rb") as json_file:
            keys.update(json.load(json_file).keys())

    print(keys)


if __name__ == "__main__":
    main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten