Seite 1 von 1

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

Verfasst: Sonntag 27. Dezember 2020, 01:12
von Mr. R341
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)...

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

Verfasst: Sonntag 27. Dezember 2020, 01:44
von Mr. R341
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.

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

Verfasst: Sonntag 27. Dezember 2020, 01:58
von Mr. R341
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']

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

Verfasst: Sonntag 27. Dezember 2020, 03:20
von __blackjack__
@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()