- Kirjasto.dat on 242 tavua ja se on Tiedostot-kansiossani, eli se on ok.
Myös Lisää uusi kirja luetteloon -lomake ilmestyy nätisti komentokehoitteen komennon jälkeen (otsikossa Lisää-sanassa vain pientä sanomista, mutta johtunee siitä UTF8:sta). - Nämä ovat samat, eilen tosin käytön myötä sinne (Tiedostot-kansio, jonne olen nämä tallentanut) ilmestyi myös _pycache_-tiedostokansio, joka sisältää:
LataaKirjaLuetteloFile.cpython-38
ja
TulostaKirjaLuetteloFile.cpython-38 - Kohta 3 korjattu uudelleen!
Kohta 1 sensijaan ei ota oonistuakseen... jos siitä ottaa risun edestä pois, niin saan herjan: SyntaxError: invalid syntax - 1. Sain pienen HUOM-ikkunan, jossa luki: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt. Vaikka se on samassa kansiossa, missä nämä muutkin...
2. Nämä kuusi herjaa:
Undefined variable 'HaetaanKirjaLuettelosta' [32, 50]
Undefined variable 'MuokataanKirjaLuetteloa' [33, 50]
Undefined variable 'PoistaKohdeKirjaLuettelosta' [34, 50]
Undefined variable 'TallennaKirjaLuettelo' [35, 50]
Unused import pickle from wildcard import [7, 1]
Unused import ShowMessage from wildcard import [7,1]
3. Muutoin tämä tulos:
'clear' is not recognized as an internal or external command,
operable program or batch file.
K I R J A L U E T T E L O N P Ä Ä V A L I K K O
1. Hae kirjan/kirjailijan nimellä tai vuosiluvulla.
2. Muokkaa kirjaluettelon merkintää.
3. Poista kirjaluettelon merkintä.
4. Lisää kirjaluetteloon merkintä.
5. Tulosta kirjaluettelo.
6. Lopetus
Anna valintasi [1-6] : - Juuh, ei antanut tallentaa niitä kuin HTML:nä..., mutta avattaessa ovat todellakin 'pythonia'! Eli kopioin ne kaikki kolme itselleni omaan kansioonsa kopioin vielä sen Kirjasto.txt-tiedoston näiden kanssa samaan kansioon nimellä: Kirjasto.dat
- Nyt minulla on siis erillinen Tiedostot-kansio, jossa on kolme lähettämääsi tiedostoa niillä nimillään ja sellaisinaan, kuin sinä olit ne tallentanut.
Ja nytkö siis muutan oman Kirjasto.txt-tiedostoni muotoon Kirjasto.dat ja tallennan sen Tiedostot-kansioon noidn muiden seuraksi? - Tallensin kaikki kolme HTML-tiedostoa omaan kansioonsa niillä nimillä, kuin ne olivat... sieltä ne voi sitten ottaa...
Tuo Windows-muutokset-'tehtävä' kyllä hirvittää, mutta yritetään... - Noin ja Zenity asentui, mutta tiedä sitten osaanko sovittaa niitä Windowsin vastaaviin...
- Tämä onnistui, jos tarkoitus oli se, että jäljelle jää vain alla oleva.
os.system('cls') siis poisti kaiken sitä edeltävän.
1. Hae kirjaluettelosta kirjan nimellä, kirjailijan nimellä, tai vuosiluvulla.
2. Muokkaa kirjaluettelon merkintää.
3. Poista kirjaluettelon merkintä.
4. Lisää kirjaluetteloon merkintä.
5. Tulosta kirjaluettelo.
6. Lopetus.
Anna valintasi [1 - 6]: - Ja nyt olen tässä kohtaa. Tietenkään valikon valinnat eivät vielä toimi, mutta edistystä silti!!!
KIRJA KIRJOITTAJA VUOSI
Peppi Pitkätossu Astrid Lindgren 1945
Vaahteramäen Eemeli Astrid Lindgren 1963
Pikku naisia Louisa M. Alcott 1868
Annan nuoruusvuodet L. M. Montgomery 1908
Paina jotain jatkaaksesi
'clear' is not recognized as an internal or external command,
operable program or batch file.
1. Hae kirjan nimellä, kirjailijan nimellä, tai vuosiluvulla.
2. Muokkaa kirjaluettelon merkintää.
3. Poista kirjaluettelon merkintä.
4. Lisää kirjaluetteloon merkintä.
5. Tulosta kirjaluettelo.
6. Lopetus.
Anna valintasi [1-6] : - Hip huraa!!! Nyt toimii ainakin tallennus tiedostoon ja haku tiedostosta, kun otin turhan puolipisteen pois! Nätimmin tulivat näytölle, kuin tuossa alla, mutta pakko oli laittaa näytille!
Nyt alan tekemän sitä päävalikkoa ja jätän sen yhden rivin ylimääräisen puolipisteen laittamatta.
KIRJA KIRJOITTAJA VUOSI
Peppi Pitkätossu Astrid Lindgren 1945
Vaahteramäen Eemeli Astrid Lindgren 1963
Pikku naisia Louisa M. Alcott 1868
Annan nuoruusvuodet L. M. Montgomery 1908
Paina jotain jatkaaksesi - No voi ei... kyllä Windowsin..., nähtäväksi jää sitten, osaanko korjata...
- Tuo yllä oleva on nyt tehty, mutta en pääse vielä testaamaan sen toimivuutta, sillä se ei nyt jostain syystä huoli aiemmin tehdyn koodin (koodia alla) jälkimmäisen SaveListToFilen perään kaksoispistettä, eikä puolipistettä, vaan herjaa invalid syntax:a.
FileName='Kirjasto.txt'
def SaveListToFile():
with open(FileName, 'wb') as f:
pickle.dump(List, f)
SaveListToFile():
#Seuraavaksi otetaan ja luetaan luettelo tiedostosta ja tulostetaan se ruudulle.
def LoadFileToList():
if os.path.isfile(FileName): - Ok! Ja siis teen koodia Visual Studio Codessa.
- Todella outoa... sieltä sitä etsin, sillä sinne se todella on tullut aikaisemminkin. Se ilmestyi sinne tällä kertaa MELKOISELLA viiveellä... Syytä en osaa arvata, mutta tyytyväisenä totean sen nyt olevan oikeassa paikkaa. Tiedoston tekstissä vielä hieman sanomista (alla kopio tekstistä), mutta muuten koodi toimii siis tähän asti! Näin aloittelijana sitä vain luulee, että on tehnyt virheen, kun koodi ei heti ota toimiakseen...
€•ç ]”(}”(Œkirja”ŒPeppi Pitkätossu”Œ
kirjailija”ŒAstrid Lindgren”Œjv”Œ1945”u}”(hŒVaahteramäen Eemeli”hhhŒ1963”u}”(hŒPikku naisia”hŒLouisa M. Alcott”hŒ1868”u}”(hŒAnnan nuoruusvuodet”hŒL. M. Montgomery”hŒ1908”ue. - Selkeä aloitus, mutta jostain syystä se ei tee sitä Kirjasto.txt-tiedostoa, ei toisin anna herjojakaan...
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#SaveList.py
#Alustetaan kirja-lista, ja tallennetaan kiintolevylle. Kiintolevyltä löytyy tämän jälkeen (Kirjasto.txt) tiedosto, binaari formaatissa.
import pickle
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"}
]
FileName='Kirjasto.txt'
def SaveListToFile():
with open(FileName, 'wb') as f:
pickle.dump(List, f)
SaveListToFile(); - Uskomatonta... nyt se herjaa pickle:ä, vaikka kuinka yritän esitellä sitä..., miten tämä voi olla näin vaikea??? Ymmätätisinköhän sen sillä menulla tehtynä paremmin?
tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.
#_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
List = [{"kirja1", "kirjailija1", "jv1"
"kirja2", "kirjailija2", "jv2"
"kirja3", "kirjailija3", "jv3"}]
#_"Sinun tulee pitää yhtä listaa jonka tallennat näin":
def SaveListToFile():
with open("kirjasto.txt", 'wb') as f:
pickle.dump(List, f)
#_"Käytä (pickle) ja (os) kirjastoja, niin lataus ja tallennus on yksinkertaista. Tämä varmistaa tiedoston olemassa olon, ettei päädyttäisi virheeseen."
def LoadFileToList():
if os.path.isfile("kirjasto.txt"):
List=[]
with open("kirjasto.txt", 'rb') as f:
List = pickle.load(f)
return List
#_"Ihan varalta, edellisiä tallennus ja lataus funktioita kutsutaan tarvittaessa näin":
SaveListToFile();
List = LoadFileToList();
#_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. - Hmmm... ja mielestäni tein sen niin, että tallentaisi ja että ei tallantaisi vanhan päälle... ja jäin miettimään vain näitä viimeisiä herjoja...
Mitenkä se sitten korjataan niin, että tallentaa aina uutta ja jättää vanhan tallennuksen myös? - Ja herja rivillä 41 on siis: TypeError: 'set' object is not subscriptable
Enkä saa sitä poistumaan millään, tai sitten herja siirtyy toiseen paikkaan... - Ja koodini ensimmäinen rivi siis on:
#_Tämä on tehtäväharjoitukseni, joka tallentaa, jos osaan sen tehdä.