Kirjaston teossa ongelma siten, että kirjat eivät tallennu / Pythonia harjoittelen

Osaako kukaan neuvoa helposti, kuinka voisin tehdä kirjaston siten, että kirjat vielä tallentuvat. Nyt kirjastoni on sellainen, että se hävittää kirjat, kun sen sulkee. Toivoisin tosi yksinkertaista ratkaisua, jotta ymmärtäisin.
10164
Äänestä

Muut lukivat myös

Vastaukset 10

Vanhimmat
Aloittaja

List = [{"kirja":"Peppi Pitkätossu", "kirjailija":"Astrid Lindgren", "jv":"1945"},
{"kirja":"Vaahteramäen Eemeli", "kirjailija":"Astrid Lindgren", "jv":"1963"},
{"kirja":"Pikku naisia", "kirjailija":"Louisa M. Alcott", "jv":"1868"},
{"kirja":"Annan nuoruusvuodet", "kirjailija":"L. M. Montgomery", "jv":"1908"}]

#-----ALKAA Funktioiden esittely----------------------------------------

#Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
#kun poistetaan kirjaa.

#Etsitään onko List:ssä kirjaa.
def onkoKirjaa(kirja):
for x in List:
if x["kirja"]==kirja: return True
return False

#Palautetaan kirja.
def getKirja(kirja):
for x in List:
if x["kirja"]==kirja: return x
return None

#-----LOPPUU Funktioiden esittely---------------------------------------

print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
"Uuden kirjan lisäys Kirjakauppaan:", "\n"
"Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
kirja = input("Kirjan nimi: ")
kirjailija = input("Kirjailijan nimi: ")
jv = input("Julkaisuvuosi: ")

#-----ALKAA Lisätään appendilla uusi kirja------------------------------

#Lisätään uusi tuote List:aan
uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
List.append(uusiKirja)

#-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
#tiedoston avaaminen kirjoittamista varten.

#Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
tiedosto.write(kirja "\n")
tiedosto.write(kirjailija "\n")
tiedosto.write(jv "\n")

tiedosto.close() #Tiedoston sulkeminen.

tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

while True:

print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

if valinta == "Poistu": #Ohjelmasta poistuminen.
break

elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
for x in List:
print(x["kirja"])
print(x["kirjailija"])
print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
print(getKirja(valinta))

#elif valinta == "Poista":
elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
print(getKirja(valinta)) #Palautetaan kirja.
elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
poistettava = input ("Minkä kirjan haluat poistaa? ")
for i in range(len(List)):
if List[i]['kirja'] == poistettava:
del List[i]
break

print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

else:

print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

tiedosto.close() #Suljetaan tiedosto.

Äänestä

Tee ohjelman käynnistykseen latausrutiini, joka lukee tiedoston. Ja siirrä nuo List:in tiedot siihen tiedostoon, jos haluat niiden olevan mukana.

Äänestä
  • Aloittaja

    Mutta miten se latausrutiini tehdään...?

    Äänestä

  • Katjaana kirjoitti:

    Mutta miten se latausrutiini tehdään...?

    Muuta tallennusrutiini tallentamaan yksi kirja yhdelle riville eri kentät pilkulla erotettuna. Sen jälkeen luet tiedoston avausvaiheessa samaan muotoon mitä on esimerkkisi List-muuttujassa.

    Esimerkki, tiedosto.txt:
    --
    kirja1,kirjailija1,jv1
    kirja2,kirjailija2,jv2
    kirja3,kirjailija3,jv3

    Luetaan vaikka näin ja tulostetaan:
    --
    def lataaTiedot(tiedosto):
        lista = []
            with open(tiedosto, 'r') as tiedostoObjekti:
                for rivi in tiedostoObjekti:
                kirja = rivi.replace("\n","").split(',')
                if len(kirja) == 3:
                    lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
    return lista

    print(lataaTiedot('tiedosto.txt')) # testitulostus
    --
    tulostaa:
    [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija': 'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

    Äänestä

  • Aloittaja

    Anonyymi kirjoitti:

    Muuta tallennusrutiini tallentamaan yksi kirja yhdelle riville eri kentät pilkulla erotettuna. Sen jälkeen luet tiedoston avausvaiheessa samaan muotoon mitä on esimerkkisi List-muuttujassa.

    Esimerkki, tiedosto.txt:
    --
    kirja1,kirjailija1,jv1
    kirja2,kirjailija2,jv2
    kirja3,kirjailija3,jv3

    Luetaan vaikka näin ja tulostetaan:
    --
    def lataaTiedot(tiedosto):
        lista = []
            with open(tiedosto, 'r') as tiedostoObjekti:
                for rivi in tiedostoObjekti:
                kirja = rivi.replace("\n","").split(',')
                if len(kirja) == 3:
                    lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
    return lista

    print(lataaTiedot('tiedosto.txt')) # testitulostus
    --
    tulostaa:
    [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija': 'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

    Kiitos! Teenkö ensin resurssienhallintaan tiedosto.txt:n, johon syötän 'alku'kirjaston? Ja sinne ne uudetkin sitten päätyvät?

    Äänestä

  • Katjaana kirjoitti:

    Kiitos! Teenkö ensin resurssienhallintaan tiedosto.txt:n, johon syötän 'alku'kirjaston? Ja sinne ne uudetkin sitten päätyvät?

    Mikä tahansa tekstieditori käy.

    Kannattaa käyttää tiedostojen käsittelyssä "with open"-tapaa, niin ei tarvitse huolehtia sulkemisesta.

    https://www.pythonforbeginners.com/files/with-statement-in-python

    Äänestä

  • Aloittaja

    Anonyymi kirjoitti:

    Mikä tahansa tekstieditori käy.

    Kannattaa käyttää tiedostojen käsittelyssä "with open"-tapaa, niin ei tarvitse huolehtia sulkemisesta.

    https://www.pythonforbeginners.com/files/with-statement-in-python

    Kiitos jälleen. Koitan tätä ohjetta tänään-huomenna! Josko se tästä muotoutuisi. Olisi kiva saada tehtyä (vaikkakin aloittelijan tyyliin) jotain 'pysyvää'!

    Äänestä

  • Aloittaja

    Katjaana kirjoitti:

    Kiitos jälleen. Koitan tätä ohjetta tänään-huomenna! Josko se tästä muotoutuisi. Olisi kiva saada tehtyä (vaikkakin aloittelijan tyyliin) jotain 'pysyvää'!

    Voi hyvänen aika, että tämä on VAI-KE-AA!!! Laitoin tuonne alemmaksi uuden koodini. Mutta kun sain alun toimimaan, niin nyt se herjaa
    #Etsitään onko List:ssä kirjaa -kohdan riviä 41: for x in List

    Mikä tuossa x:ssä nyt on vikana, kun aiemmin siinä ei ollut??? Ja 99-rivillä on myös jotain sanomista...



    #_Tämä on tehtäväharjoitukseni, joka tallentaa, jos osaan sen tehdä.

    tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

    #_Poistin alla olevat, sillä olivat kovakoodattuja.
    #_List = [{"kirja":"Peppi Pitkätossu", "kirjailija":"Astrid Lindgren", "jv":"1945"},
    #_{"kirja":"Vaahteramäen Eemeli", "kirjailija":"Astrid Lindgren", "jv":"1963"},
    #_{"kirja":"Pikku naisia", "kirjailija":"Louisa M. Alcott", "jv":"1868"},
    #_{"kirja":"Annan nuoruusvuodet", "kirjailija":"L. M. Montgomery", "jv":"1908"}]

    #_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
    List = [{"kirja1", "kirjailija1", "jv1"
    "kirja2", "kirjailija2", "jv2"
    "kirja3", "kirjailija3", "jv3"}]

    #_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
    def lataaTiedot(tiedosto):
    lista = []
    with open(tiedosto, 'r') as tiedostoObjekti:
    for rivi in tiedostoObjekti:
    kirja = rivi.replace("\n","").split(',')
    if len(kirja) == 3:
    lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
    return lista

    #_Kirjat tulostetaan alla olevalla tavalla.
    print(lataaTiedot("kirjasto.txt"))
    [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
    'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

    tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

    #-----ALKAA Funktioiden esittely----------------------------------------

    #Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
    #kun poistetaan kirjaa.

    #Etsitään onko List:ssä kirjaa.
    def onkoKirjaa(kirja):
    for x in List:
    if x["kirja"]==kirja: return True
    return False

    #Palautetaan kirja.
    def getKirja(kirja):
    for x in List:
    if x["kirja"]==kirja: return x
    return None

    #-----LOPPUU Funktioiden esittely---------------------------------------

    print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
    "Uuden kirjan lisäys Kirjakauppaan:", "\n"
    "Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
    kirja = input("Kirjan nimi: ")
    kirjailija = input("Kirjailijan nimi: ")
    jv = input("Julkaisuvuosi: ")

    #-----ALKAA Lisätään appendilla uusi kirja------------------------------

    #Lisätään uusi tuote List:aan
    uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

    if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
    List.append(uusiKirja)

    #-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

    tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
    #tiedoston avaaminen kirjoittamista varten.

    #Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
    tiedosto.write(kirja "\n")
    tiedosto.write(kirjailija "\n")
    tiedosto.write(jv "\n")

    tiedosto.close() #Tiedoston sulkeminen.

    tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

    while True:

    print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
    print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
    print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
    print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

    valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

    if valinta == "Poistu": #Ohjelmasta poistuminen.
    break

    elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
    for x in List:
    print(x["kirja"])
    print(x["kirjailija"])
    print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

    elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
    print(getKirja(valinta))

    #elif valinta == "Poista":
    elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
    print(getKirja(valinta)) #Palautetaan kirja.
    elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
    poistettava = input ("Minkä kirjan haluat poistaa? ")
    for i in range(len(List)):
    if List[i]['kirja'] == poistettava:
    del List[i]
    break

    print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

    else:

    print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

    tiedosto.close() #Suljetaan tiedosto.

    Äänestä

  • Aloittaja

    Katjaana kirjoitti:

    Voi hyvänen aika, että tämä on VAI-KE-AA!!! Laitoin tuonne alemmaksi uuden koodini. Mutta kun sain alun toimimaan, niin nyt se herjaa
    #Etsitään onko List:ssä kirjaa -kohdan riviä 41: for x in List

    Mikä tuossa x:ssä nyt on vikana, kun aiemmin siinä ei ollut??? Ja 99-rivillä on myös jotain sanomista...



    #_Tämä on tehtäväharjoitukseni, joka tallentaa, jos osaan sen tehdä.

    tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

    #_Poistin alla olevat, sillä olivat kovakoodattuja.
    #_List = [{"kirja":"Peppi Pitkätossu", "kirjailija":"Astrid Lindgren", "jv":"1945"},
    #_{"kirja":"Vaahteramäen Eemeli", "kirjailija":"Astrid Lindgren", "jv":"1963"},
    #_{"kirja":"Pikku naisia", "kirjailija":"Louisa M. Alcott", "jv":"1868"},
    #_{"kirja":"Annan nuoruusvuodet", "kirjailija":"L. M. Montgomery", "jv":"1908"}]

    #_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
    List = [{"kirja1", "kirjailija1", "jv1"
    "kirja2", "kirjailija2", "jv2"
    "kirja3", "kirjailija3", "jv3"}]

    #_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
    def lataaTiedot(tiedosto):
    lista = []
    with open(tiedosto, 'r') as tiedostoObjekti:
    for rivi in tiedostoObjekti:
    kirja = rivi.replace("\n","").split(',')
    if len(kirja) == 3:
    lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
    return lista

    #_Kirjat tulostetaan alla olevalla tavalla.
    print(lataaTiedot("kirjasto.txt"))
    [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
    'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

    tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

    #-----ALKAA Funktioiden esittely----------------------------------------

    #Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
    #kun poistetaan kirjaa.

    #Etsitään onko List:ssä kirjaa.
    def onkoKirjaa(kirja):
    for x in List:
    if x["kirja"]==kirja: return True
    return False

    #Palautetaan kirja.
    def getKirja(kirja):
    for x in List:
    if x["kirja"]==kirja: return x
    return None

    #-----LOPPUU Funktioiden esittely---------------------------------------

    print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
    "Uuden kirjan lisäys Kirjakauppaan:", "\n"
    "Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
    kirja = input("Kirjan nimi: ")
    kirjailija = input("Kirjailijan nimi: ")
    jv = input("Julkaisuvuosi: ")

    #-----ALKAA Lisätään appendilla uusi kirja------------------------------

    #Lisätään uusi tuote List:aan
    uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

    if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
    List.append(uusiKirja)

    #-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

    tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
    #tiedoston avaaminen kirjoittamista varten.

    #Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
    tiedosto.write(kirja "\n")
    tiedosto.write(kirjailija "\n")
    tiedosto.write(jv "\n")

    tiedosto.close() #Tiedoston sulkeminen.

    tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

    while True:

    print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
    print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
    print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
    print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

    valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

    if valinta == "Poistu": #Ohjelmasta poistuminen.
    break

    elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
    for x in List:
    print(x["kirja"])
    print(x["kirjailija"])
    print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

    elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
    print(getKirja(valinta))

    #elif valinta == "Poista":
    elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
    print(getKirja(valinta)) #Palautetaan kirja.
    elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
    poistettava = input ("Minkä kirjan haluat poistaa? ")
    for i in range(len(List)):
    if List[i]['kirja'] == poistettava:
    del List[i]
    break

    print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

    else:

    print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

    tiedosto.close() #Suljetaan tiedosto.

    Ja koodini ensimmäinen rivi siis on:

    #_Tämä on tehtäväharjoitukseni, joka tallentaa, jos osaan sen tehdä.

    Äänestä

  • Aloittaja

    Katjaana kirjoitti:

    Ja koodini ensimmäinen rivi siis on:

    #_Tämä on tehtäväharjoitukseni, joka tallentaa, jos osaan sen tehdä.

    Ja herja rivillä 41 on siis: TypeError: 'set' object is not subscriptable

    Enkä saa sitä poistumaan millään, tai sitten herja siirtyy toiseen paikkaan...

    Äänestä

Kommentoi aloitusta


Katjaana kirjoitti:

Osaako kukaan neuvoa helposti, kuinka voisin tehdä kirjaston siten, että kirjat vielä tallentuvat. Nyt kirjastoni on sellainen, että se hävittää kirjat, kun sen sulkee. Toivoisin tosi yksinkertaista ratkaisua, jotta ymmärtäisin.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu