Luetteloiden lukeminen ja kirjoittaminen tiedostoon Python
sarjoitettuina tietorakenteina Python-ohjelmoijat käyttävät intensiivisesti taulukoita, luetteloita ja sanakirjoja. Näiden tietorakenteiden jatkuva säilyttäminen vaatii joko tiedoston tai tietokannan, jonka kanssa työskennellä. Tässä artikkelissa kuvataan, miten kirjoittaa luettelo tiedostoon, ja miten lukea, että luettelo takaisin muistiin.
tietojen kirjoittamiseen tiedostoon ja tietojen lukemiseen tiedostosta Python-ohjelmointikieli tarjoaa standardimenetelmät write()
ja read()
yhden rivin käsittelyyn sekä writelines()
ja readlines()
useiden rivien käsittelyyn. Lisäksi sekä pickle
että json
– moduuli mahdollistavat näppärät tavat käsitellä myös sarjoitettuja tietokokonaisuuksia.
luku-ja kirjoitusmenetelmien
käyttäminen merkkien (merkkijonojen) käsittelyyn perusmenetelmät toimivat erinomaisesti. Tällaisen luettelon tallentaminen rivi riviltä tiedostoon listfile.txt
voidaan tehdä seuraavasti:
# define list of placesplaces = with open('listfile.txt', 'w') as filehandle: for listitem in places: filehandle.write('%s\n' % listitem)
rivillä 6 listitem
laajennetaan rivinvaihdolla ”\n” ensinnäkin ja tallennetaan tulostiedostoon toiseksi. Voit lukea koko luettelon tiedostolistatiedostosta.txt takaisin muistiin tämä Python-koodi näyttää, miten se toimii:
# define an empty listplaces = # open file and read the content in a listwith open('listfile.txt', 'r') as filehandle: for line in filehandle: # remove linebreak which is the last character of the string currentPlace = line # add item to the list places.append(currentPlace)
muista, että sinun täytyy poistaa rivinvaihde merkkijonon päästä. Tässä tapauksessa se auttaa meitä, että Python sallii luettelotoiminnot merkkijonoja, liian. Koodin rivillä 8 tämä poisto tehdään yksinkertaisesti luettelotoimintana itse merkkijonolla, joka säilyttää kaiken paitsi viimeisen elementin. Tämä elementti sisältää merkin ”\n”, joka edustaa linebreak Unix/Linux-järjestelmissä.
käyttämällä tämän artikkelin alussa mainittuja writelines-ja readlines-menetelmiä
Python sisältää myös kaksi menetelmää writelines()
ja readlines()
kirjoittaa ja lukea useita rivejä yhdessä vaiheessa. Koko luettelon kirjoittamiseksi levylle Python-koodi on seuraava:
# define list of placesplaces_list = with open('listfile.txt', 'w') as filehandle: filehandle.writelines("%s\n" % place for place in places_list)
lukea koko lista levyllä olevasta tiedostosta Python-koodi on seuraava:
# define empty listplaces = # open file and read the content in a listwith open('listfile.txt', 'r') as filehandle: filecontents = filehandle.readlines() for line in filecontents: # remove linebreak which is the last character of the string current_place = line # add item to the list places.append(current_place)
yllä oleva listaus noudattaa perinteisempää muista ohjelmointikielistä lainattua lähestymistapaa. Jos haluat kirjoittaa sen Pythonisemmin, tutustu alla olevaan koodiin:
# define empty listplaces = # open file and read the content in a listwith open('listfile.txt', 'r') as filehandle: places =
avattuaan tiedoston listfile.txt
rivillä 5, luettelon palauttaminen tapahtuu kokonaan rivillä 6. Ensinnäkin tiedoston sisältö luetaan kautta readlines()
. Toiseksi for
silmukka jokaiselta riviltä poistetaan rivimerkki rstrip()
– menetelmällä. Kolmanneksi merkkijono lisätään paikkaluetteloon uutena luettelokohtana. Verrattuna listaukseen ennen koodi on paljon kompakti, mutta voi olla vaikeampi lukea aloitteleville Python-ohjelmoijille.
suolakurkkumoduulia
tähän asti selitetyt eri menetelmät tallentavat listan siten, että ihmiset voivat yhä lukea sitä. Jos tätä ei tarvita suolakurkku moduuli voi tulla varsin kätevä sinulle. Sen dump()
menetelmä tallentaa listan tehokkaasti binäärisenä datavirtana. Ensiksi rivillä 7 (alla olevassa koodissa) avataan tulostiedosto listfile.data
binäärikirjoitusta (”wb”) varten. Toiseksi rivillä 9
lista tallennetaan avattuun tiedostoon dump()
– menetelmällä.
# load additional moduleimport pickle# define a list of placesplacesList = with open('listfile.data', 'wb') as filehandle: # store the data as binary data stream pickle.dump(placesList, filehandle)
seuraavassa vaiheessa luemme listan tiedostosta seuraavasti. Ensiksi tulostiedosto listfile.data
avataan binäärisesti luettavaksi (”rb”) rivillä 4. Toiseksi paikkalista Ladataan tiedostosta käyttäen load()
– menetelmää.
# load additional moduleimport picklewith open('listfile.data', 'rb') as filehandle: # read the data as binary data stream placesList = pickle.load(filehandle)
tässä kaksi esimerkkiä osoittavat merkkijonojen käytön. Tosin pickle
toimii kaikenlaisten Python-olioiden, kuten merkkijonojen, numeroiden, itse määriteltyjen rakenteiden ja jokaisen muun Pythonin tarjoaman sisäänrakennetun tietorakenteen kanssa.
käyttämällä JSON-muotoa
binääridatan formaatti pickle
käyttää nimenomaan Pythonia. Eri ohjelmien yhteentoimivuuden parantamiseksi JavaScript Object Notation (JSON) tarjoaa helppokäyttöisen ja ihmisen luettavan skeeman, ja siitä tuli siten hyvin suosittu.
seuraavassa esimerkissä osoitetaan, miten JSON-moduulin avulla voidaan kirjoittaa luettelo sekamuuttujatyypeistä tulostetiedostoon. Rivillä 4 määritellään perusluettelo. Avattuaan tulostetiedoston riville 7 kirjoitettavaksi dump()
– menetelmä tallentaa tiedoston perusluettelon käyttäen JSON-merkintää.
import json# define list with valuesbasicList = # open output file for writingwith open('listfile.txt', 'w') as filehandle: json.dump(basicList, filehandle)
tulostetiedoston sisällön lukeminen takaisin muistiin on yhtä yksinkertaista kuin tietojen kirjoittaminen. dump()
on nimetty load()
, ja se toimii seuraavasti:
import json# open output file for readingwith open('listfile.txt', 'r') as filehandle: basicList = json.load(filehandle)
johtopäätös
edellä esitetyt eri menetelmät vaihtelevat yksinkertaisesta kirjoitus – /lukemistiedosta dumppaus – /lataustietoon binäärivirtojen kautta picklen ja JSONin avulla. Tämä helpottaa luettelon säilyttämistä jatkuvasti ja sen lukemista takaisin muistiin.
kiitokset
kirjoittaja haluaa kiittää Zoleka Hatitongwea tuesta kirjoitusta valmistellessa.