TypeError: 'set' object is not subscriptable

'Kirjasto'-koodini alkaa valmistua, mutta herjaa rivillä 41: TypeError: 'set' object is not subscriptable. Enkä saa sitä poistumaan millään. Osaako joku auttaa?



#_Tämä on Katjaanan sellainen harjoitus, joka myös 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.

0

190

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000

      Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

      Luetuimmat keskustelut

      1. Suomen markka otettiin käyttöön vuonna 1860

        Suomi käytti vuoteen 1840 asti rahayksikkönään rinnakkain Ruotsin riikintaalareita ja Venäjän ruplaa. Tämän jälkeen oli
        Maailman menoa
        37
        9291
      2. "Mä elän vieläkin"

        Ikurin turbiini vetäisi taannoin lainabiisin Topin (RIP också) ja kumppaneiden kanssa. Toivottavasti on yläkerrassa kunn
        Tampere
        32
        3841
      3. Yksityinen sektori aiheuttanut Suomen taantuman

        Investointien sijasta nostaneet voitot osinkoina omistajille. Ehdotan korjausliikkeenä yksityisen sektorin sosialisoimi
        Maailman menoa
        81
        2419
      4. Pate Mustajärvi on kuollut

        Ihan pari tuntia sitten. Että sellaista. https://www.is.fi/viihde/art-2000011715177.html
        Maailman menoa
        119
        2373
      5. Kylläpä asiat onkin nyt hyvin verrattuna Sannan aikaan

        Sannan aikana aähkön alv oli 10%, nyt 25,5%. Ajatelkaa nytkin pörssisähkö on ilmaista, keskellä talvea! Bensan hinta on
        Maailman menoa
        25
        1925
      6. Kaivatullesi viesti ensi vuoteen?

        Kerro meneekö naiselle vai miehelle ja vähintään yksi tunniste, esim. kirjain.
        Ikävä
        37
        1899
      7. Miten ikinä kelpaisin sulle

        Sinä saat niiltä muilta naisilta paljon enemmän, mitä minulta... Tai mihin minä olisin valmis. Enkä edes olisi niin tait
        Ikävä
        15
        1590
      8. Edes vitamiinit eivät taanneet loputonta elämää

        Nimittäin niistä rahaa itselleen taikonut tohtori siirtyi tuonpuoleiseen.
        Maailman menoa
        32
        1411
      9. Kuinka kauan vielä

        jaksetaan vastustaa toisiamme?
        Ikävä
        71
        1247
      10. Esko ja Martina viettävät joulua

        Entisen avioparin joulunvietto on ylittänyt IS uutiskynnyksen
        Kotimaiset julkkisjuorut
        171
        1038
      Aihe