JSON-i lugemine ja faili kirjutamine Pythonis

Sissejuhatus

Selles juhendis vaatleme, kuidas lugeda ja kirjutada JSON-andmeid Pythonis failist ja faili, kasutades json moodul.

JSON (JavaScripti objekti märkimine) on andmete serialiseerimiseks ülipopulaarne formaat, arvestades, kui üldiselt rakendatav ja kerge see on – samas ka üsna inimsõbralik. Eelkõige kasutatakse seda laialdaselt veebiarendusmaailmas, kus tõenäoliselt kohtate JSON-serialiseeritud objekte, mis saadetakse REST API-d, rakenduse konfigureerimine või isegi lihtne andmete salvestamine.

Arvestades selle levimust, on JSON-failide (või stringide) lugemine ja sõelumine üsna tavaline ning sama levinud on ka JSON-i saatmiseks kirjutamine. Selles juhendis vaatleme, kuidas seda võimendada json moodul Pythonis JSON-i lugemiseks ja kirjutamiseks.

JSON-i kirjutamine faili Pythoni abil koos json.dump() ja json.dumps()

JSON-i sisu Pythonis faili kirjutamiseks saame kasutada json.dump() ja json.dumps(). Need on eraldi meetodid ja saavutage erinev tulemus:

  • json.dumps() – Serialiseerib objekti JSON-vormingusse nöör
  • json.dump() – Objekti järjestamine JSON-voogu failidesse või pesadesse salvestamiseks

Märge: "S" sõna "prügikogus" on tegelikult lühend "väljaviske string".

JSON-i loomulik vorming on sarnane a kaart arvutiteaduses – kaart key-value paarid. Pythonis on a sõnaraamat on kaardirakendus, nii et loomulikult suudame JSON-i ustavalt esindada läbi a dict. Sõnastik võib sisaldada muid pesastatud sõnastikke, massiive, tõeväärtusi või muid primitiivseid tüüpe, nagu täisarvud ja stringid.

(Nt.

Märge: Sisseehitatud Json pakett pakub mitmeid mugavusmeetodeid, mis võimaldavad meil JSON-i ja sõnaraamatute vahel teisendada.

(Nt.

Nagu öeldud, impordime json moodulit, määratlege mõne andmetega sõnastik ja seejärel teisendage see enne faili salvestamist JSON-iks:

import json

data = {
    'employees' : [
        {
            'name' : 'John Doe',
            'department' : 'Marketing',
            'place' : 'Remote'
        },
        {
            'name' : 'Jane Doe',
            'department' : 'Software Engineering',
            'place' : 'Remote'
        },
        {
            'name' : 'Don Joe',
            'department' : 'Software Engineering',
            'place' : 'Office'
        }
    ]
}


json_string = json.dumps(data)
print(json_string)

Selle tulemuseks on:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Siin on meil lihtne sõnaraamat, milles on mõned employees, millest igaühel on a name, department ja place. dumps() funktsioon json moodul prügimäed sõnastik JSON-i sisusse ja tagastab a JSON-string.

Pärast seeriastamist võite saata selle mõnele teisele teenusele, mis selle deserialiseerib, või näiteks salvestada. Selle JSON-stringi faili salvestamiseks avame faili lihtsalt kirjutusrežiimis ja kirjutame selle üles. Kui te ei soovi andmeid hilisemaks kasutamiseks eraldada sõltumatuks muutujaks ja soovite need lihtsalt faili koondada, võite vahele jätta dumps() funktsiooni ja kasutamist dump() instad:


with open('json_data.json', 'w') as outfile:
    outfile.write(json_string)


with open('json_data.json', 'w') as outfile:
    json.dump(json_string, outfile)

Mis tahes failitaolise objekti saab edasi anda teise argumendile dump() funktsiooni, isegi kui see pole tegelik fail. Hea näide selle kohta oleks pesa, mida saab avada, sulgeda ja kirjutada samamoodi nagu faili.

JSON-i lugemine failist Pythoniga koos json.load() ja json.loads()

Sõnastiku sisu ja JSON-stringi vaheline vastendamine on lihtne, nii et nende kahe vahel on lihtne teisendada. Sama loogika mis dump() ja dumps() rakendatakse load() ja loads(). Palju nagu json.dumps(), json.loads() funktsioon aktsepteerib JSON-stringi ja teisendab selle sõnaraamatuks, samas json.load() võimaldab laadida faili:

import json

with open('json_data.json') as json_file:
    data = json.load(json_file)
    print(data)

Selle tulemuseks on:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Teise võimalusena loeme JSON-stringi sõnastikku:

import json

python_dictionary = json.loads(json_string)
print(python_dictionary)

Mille tulemuseks on ka:

{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

See on eriti kasulik JSON-i saatvate REST API vastuste sõelumiseks. Need andmed jõuavad teieni stringina, mille saate seejärel edastada json.loads() otse ja teil on töötamiseks palju paremini hallatav sõnastik!

Sorteerimine, ilus printimine, eraldajad ja kodeerimine

Kui teie andmed järjestatakse Pythoniga JSON-i, ei ole standardvorming, mille eesmärk on minimeerida sõnumite edastamiseks vajalikku mälu, eriti loetav, kuna tühikud on välistatud. Kuigi see on andmeedastuseks ideaalne käitumine (arvutid ei hooli loetavusest, vaid nende suurusest), võib mõnikord olla vaja teha väikseid muudatusi, näiteks lisada tühikuid, et muuta see inimloetavaks.

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

Märge: json.dump()/json.dumps() ja json.load()/json.loads() kõik pakuvad vormindamisvalikuid.

Päris prinditav JSON Pythonis

JSON-i inimloetavaks muutmine (teise nimega "ilusalt trükkimine") on sama lihtne kui täisarvu väärtuse edastamine indent parameetrit:

import json
data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
print(json.dumps(data, indent=4))

See kortsutab igale uuele loogilisele plokile 4-tühikulise taande:

{
    "people": [
        {
            "website": "stackabuse.com", 
            "from": "Nebraska", 
            "name": "Scott"
        }
    ]
}

Teine võimalus on kasutada käsurea tööriista - json.tool. Sellega saate JSON-i käsurealt ilusti printida, ilma et see mõjutaks edastatud stringi ja mõjutaks lihtsalt seda, kuidas see standardses väljundtorus kuvatakse:

$ echo '{"people":[{"name":"Scott", "website":"stackabuse.com", "from":"Nebraska"}]}' | python -m json.tool
{
    "people": [
        {
            "name": "Scott",
            "website": "stackabuse.com"
            "from": "Nebraska",
        }
    ]
}

JSON-objektide sortimine võtmete järgi

JSON-i mõistes:

"Objekt on järjestamata nime/väärtuste paaride kogum."

Võtmete järjekord ei ole garanteeritud, kuid on võimalik, et peate võtmejärjestuse jõustama. Tellimuse saavutamiseks võite läbida True Euroopa sort_keys võimalus kasutamisel json.dump() or json.dumps():

import json
data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
print(json.dumps(data, sort_keys=True, indent=4))

Selle tulemuseks on:

{
    "people": [
        {
            "from": "Nebraska",
            "name": "Scott",
            "website": "stackabuse.com"
        }
    ]
}

ASCII tekst ja kodeering

Vaikimisi json.dump() ja json.dumps() tagab, et antud Pythoni sõnastikus olev tekst on ASCII-kodeeringuga. Kui on olemas mitte-ASCII märgid, siis need paotavad automaatselt, nagu on näidatud järgmises näites:

import json
data = {'item': 'Beer', 'cost':'£4.00'}
jstr = json.dumps(data, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "u00a34.00"
}

See ei ole alati vastuvõetav ja paljudel juhtudel võite soovida Unicode'i märgid muutmata jätta. Selleks määrake ensure_ascii võimalus False:

jstr = json.dumps(data, ensure_ascii=False, indent=4)
print(jstr)
{
    "item": "Beer",
    "cost": "£4.00"
}

Jätke kohandatud võtmeandmetüübid vahele

Kui võti teie sõnastikus on mitteprimitiivset tüüpi (str, int, float, bool or None) Of TypeError tõstetakse, kui proovite JSON-i sisu faili dumpeerida. Saate need klahvid vahele jätta, kasutades skipkeys argument:

jstr = json.dumps(data, skipkeys=True)

Ringliku kontrolli lubamine ja keelamine

Kui JSON-objekti atribuut viitab iseendale või teisele objektile, mis viitab tagasi emaobjektile, luuakse lõpmatult rekursiivne JSON. Lõpmatu rekursioon põhjustab tavaliselt mälu kiire eraldamise, kuni seadme mälu saab otsa, ja JSON-i dumpingu korral RecursionError tõstetakse ja kaadamine peatatakse.

Seda reguleerib check_circular lipp, mis on True vaikimisi ja hoiab ära võimalikud probleemid ringsõltuvuste kirjutamisel. Selle väljalülitamiseks saate määrata selle väärtuseks `False:

jstr = json.dumps(data, check_circular=False)

Pange aga tähele, et see on kõrgelt ei soovitata.

NaN-ide lubamine ja keelamine

NaN-väärtused, nt -inf, inf ja nan võib pugeda objektidesse, mida soovite järjestada või deserialiseerida. JSON standard ei luba NaN väärtuste jaoks, kuid need kannavad siiski loogilist väärtust, mida võiksite sõnumis edastada. Teisest küljest – võite soovida neid NaN väärtusi jõustada ei ole edastada ja teha selle asemel erand. The allow_nan lipp on seatud True vaikimisi ja võimaldab teil NaN-i väärtusi järjestada ja deserialiseerida, asendades need JavaScripti ekvivalentidega (Inifinity, -Infinity ja NaN).

Kui seate lipu False selle asemel – lähete üle rangelt JSON-standardiseeritud vormingule, mis tõstab a ValueError kui teie objektid sisaldavad atribuute järgmiste väärtustega:

jstr = json.dumps(data, allow_nan=False)

Eraldajate vahetamine

JSON-is eraldatakse võtmed väärtustest koolonitega (:) ja üksused eraldatakse üksteisest komadega (,):

key1:value1,
key2:value2

JSON-i lugemise ja kirjutamise vaikeeraldajad Pythonis on (', ', ': ') koos valged ruumid pärast komasid ja kooloneid. Saate neid muuta tühikute vahelejätmiseks ja seega JSON-i pisut kompaktsemaks muutmiseks või muuta eraldajaid täielikult muude erimärkidega erineva esituse jaoks:


jstr = json.dumps(data, separators=(',', ':'))

Ühilduvusprobleemid Python 2-ga

Kui kasutate Pythoni vanemat versiooni (2.x), võite sattuda a TypeError üritades JSON-i sisu faili kustutada. Nimelt, kui sisu sisaldab mitte-ASCII märki, a TypeError on üles tõstetud, isegi kui edastate kodeeringu argumendi, kui kasutate json.dump() meetod:


with open('json_data.json', 'w', encoding='utf-8') as outfile:
    json.dump(json_string, outfile, ensure_ascii=False)

Kui kohtate seda servajuhti, mis on hiljem Pythoni järgmistes versioonides parandatud, proovige seda kasutada json.dumps() selle asemel ja kirjutage stringi sisu faili, selle asemel et sisu otse faili voogesitada.

Järeldus

Selles juhendis tutvustasime teile json.dump(), json.dumps(), json.load()ja json.loads() meetodid, mis aitavad JSON-stringe järjestada ja deserialiseerida.

Seejärel uurisime, kuidas saate JSON-objekte sortida, neid ilusti printida, kodeeringut muuta, kohandatud võtme andmetüüpe vahele jätta, ringkontrolli lubada või keelata ja kas NaN-id on lubatud, samuti kuidas muuta nende eraldajaid. serialiseerimine ja deserialiseerimine.

Kuna JSON on üks populaarsemaid viise struktureeritud andmete järjestamiseks, peate tõenäoliselt sellega üsna sageli suhtlema, eriti kui töötate veebirakendustega. Pythoni oma json moodul on suurepärane viis alustamiseks, kuigi tõenäoliselt leiate selle lihtne on veel üks suurepärane alternatiiv, mis on JSON-i süntaksi suhtes palju vähem range.

Ajatempel:

Veel alates Stackabus