Branje in pisanje seznamov v datoteko v Pythonu

Predstavitev

Programerji Pythona intenzivno uporabljajo nize, sezname in slovarje kot serializirane podatkovne strukture. Za trajno shranjevanje teh podatkovnih struktur je za pravilno delovanje potrebna bodisi datoteka bodisi zbirka podatkov.

V tem članku si bomo ogledali, kako zapisati seznam v datoteko in kako ta seznam prebrati nazaj v pomnilnik.

Da zapisati podatke v datoteko, in do branje podatkov iz datoteke, programski jezik Python ponuja standardne metode write() in read() za obravnavo ene vrstice, pa tudi writelines() in readlines() za delo z več vrsticami. Poleg tega oba pickle in json moduli omogočajo tudi pametne načine ravnanja s serializiranimi nizi podatkov.

Uporaba preberi () in piši () Metode

Ukvarjanje z znaki (nizi) osnovno read() in write() metode delujejo odlično. Shranjevanje takega seznama po vrsticah v datoteko listfile.txt lahko storite na naslednji način:


places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    for listitem in places:
        filehandle.write(f'{listitem}n')

O listitem se razširi s prelomom vrstice "n", najprej in nato shranjen v izhodno datoteko. Zdaj si lahko ogledamo, kako prebrati celoten seznam iz datoteke listfile.txt nazaj v spomin:


places = []


with open('listfile.txt', 'r') as filehandle:
    for line in filehandle:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

Ne pozabite, da boste morali odstraniti prelom vrstice s konca niza. V tem primeru nam pomaga, da Python dovoljuje tudi operacije s seznami na nizih. Ta odstranitev se preprosto izvede kot operacija seznama na samem nizu, ki ohrani vse razen zadnjega elementa. Ta element vsebuje znak "n" ki predstavlja prelom vrstice v sistemih UNIX/Linux.

Uporaba pisne vrstice() in readlines() Metode

Kot je bilo omenjeno na začetku tega članka, Python vsebuje tudi dve metodi – writelines() in readlines() – za pisanje oziroma branje več vrstic v enem koraku. Zapišimo celoten seznam v datoteko na disku:


places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.txt', 'w') as filehandle:
    filehandle.writelines(f"{place for place in places_list}n")

Za branje celotnega seznama iz datoteke na disku moramo:


places = []


with open('listfile.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()
    for line in filecontents:
        
        curr_place = line[:-1]
        
        places.append(curr_place)

Zgornja koda sledi bolj tradicionalnemu pristopu, izposojenemu iz drugih programskih jezikov. Zapišimo ga v več Pythonic način:


places = []


with open('listfile.txt', 'r') as filehandle:
    places = [current_place.rstrip() for current_place in filehandle.readlines()]

Najprej se prebere vsebina datoteke readlines(). Drugič, v a for zanke iz vsake vrstice se znak za prelom vrstice odstrani z uporabo rstrip() metoda. Tretjič, niz je dodan na seznam mest kot nova postavka seznama.

V primerjavi s prejšnjim seznamom je koda veliko bolj kompaktna, vendar jo lahko začetniki programerji Python težje berejo.

Uporaba modula Joblib

Začetne metode, ki so bile do zdaj razložene, shranijo seznam tako, da ga lahko ljudje še vedno preberejo – dobesedno zaporedni seznam v datoteki. To je odlično za ustvarjanje preprostih poročil ali pošiljanje izvoznih datotek za nadaljnjo uporabo uporabnikov, kot so datoteke CSV. Vendar – če je vaš cilj le serializirati seznam v datoteko, ki jo je mogoče naložiti pozneje, ni potrebe po shranjevanju v človeku berljivem formatu.

O joblib modul ponuja najlažji način za izpis predmeta Python (lahko je pravzaprav kateri koli predmet):

import joblib

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

joblib.dump(places, 'places.sav')

places = joblib.load('places.sav')
print(places) 

joblib ostaja najpreprostejši in najčistejši način za serializacijo predmetov v učinkoviti obliki in njihovo kasnejše nalaganje. Uporabite lahko poljubno obliko, kot npr .sav, .data, itd. Pravzaprav ni pomembno – oboje joblib in podobne alternative pickle bo dobro prebral datoteke.

Uporaba pickle Moduli

Kot alternativa joblib, lahko uporabimo pickle! Svoje dump() metoda učinkovito shrani seznam kot binarni podatkovni tok. Prvič, izhodna datoteka listfile.data je odprt za binarno pisanje ("wb"). Drugič, seznam je shranjen v odprti datoteki z uporabo dump() metoda:

import pickle

places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.data', 'wb') as filehandle:
    
    pickle.dump(places, filehandle)

Kot naslednji korak preberemo seznam iz datoteke, kot sledi. Prvič, izhodna datoteka listfile.data se odpre binarno za branje ("rb"). Drugič, seznam mest se naloži iz datoteke z uporabo load() metoda:

import pickle

with open('listfile.data', 'rb') as filehandle:
    
    placesList = pickle.load(filehandle)

Ta dva primera prikazujeta uporabo nizov. čeprav, pickle deluje z vsemi vrstami objektov Python, kot so nizi, števila, samodefinirane strukture in vse druge vgrajene podatkovne strukture, ki jih ponuja Python.

Uporaba formata JSON

Binarni format podatkov pickle uporaba je specifična za Python. Za izboljšanje interoperabilnosti med različnimi programi je JavaScript Object Notation (JSON) ponuja shemo, ki je preprosta za uporabo in človeku berljiva, in je tako postala zelo priljubljena za serializiranje datotek in njihovo skupno rabo prek API-jev.

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

Naslednji primer prikazuje, kako napisati seznam vrst mešanih spremenljivk v izhodno datoteko z uporabo json modul. Ko odprete izhodno datoteko za pisanje, se dump() metoda shrani osnovni seznam v datoteko z uporabo zapisa JSON:

import json


basic_list = [1, "Cape Town", 4.6]


with open('listfile.txt', 'w') as filehandle:
    json.dump(basic_list, filehandle)

Branje vsebine izhodne datoteke nazaj v pomnilnik je tako preprosto kot zapisovanje podatkov. Ustrezna metoda za dump() je imenovan load():

import json


with open('listfile.txt', 'r') as filehandle:
    basic_list = json.load(filehandle)

zaključek

Različne metode, ki smo jih prikazali zgoraj, segajo od preprostega zapisovanja/branja podatkov do izpisovanja/nalaganja podatkov prek binarnih tokov z uporabo pickle in JSON. To poenostavi trajno shranjevanje seznama in njegovo branje nazaj v pomnilnik.

Časovni žig:

Več od Stackabuse