Python Karkkikauppa tallentavaksi versioksi toiveena...

Liittynyt
02.05.2020
Viestejä
32
Voihan vietävä...

Oma Karkkikauppani toimii siis siten, että se ei tallenna..., muuten hyvin! Osaisiko joku muistuttaa mieleeni, että kuinka se tallennus .txt-tiedostoon tapahtui? Ei siis mitään hienoa, sillä en ehkä silloin ymmärrä..., ihan karkki.txt on toiveena.



Python:
"""

herkku1 = {”tuote”:”Fasu”, ”valmistaja”:”Fazer”}

herkku2 = {”tuote”:”Suukko”, ”valmistaja”:”Brunberg”}

herkku3 = {”tuote”:”Lakupala”, ”valmistaja”:”Panda”}

"""

List = [{"tuote":"Fasu", "valmistaja":"Fazer"},{"tuote":"Suukko", "valmistaja":"Brunberg"},{"tuote":"Lakupala", "valmistaja":"Panda"}]

#-----ALKAA Funktioiden esittely, joita tarvitaan myöhemmin----------

#Näitä kahta funktiota tarvitaan, kun etsitään, onko Karkkikaupassa kysyttyä tuotetta...

#Etsitään onko List:ssä tuotetta tuote

def onkoTuotetta(tuote):

    for x in List:

        if x["tuote"]==tuote: return True

    return False

#Etsitään tuote List:stä ja palautetaan se

def getTuote(tuote):

    for x in List:

        if x["tuote"]==tuote: return x

    return None

#-----LOPPUU Funktioiden esittely, joita tarvitaan myöhemmin---------

print("Tervetuloa Karkkikauppaan!", "\n" , "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.

"Uuden tuotteen lisäys karkkikauppaan:" ,"\n"

"Jos et nyt halua lisätä tuotetta, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")

tuote = input("Karkin nimi: ")

valmistaja = input("Valmistajan nimi: ")

#parasta_ennen_pvm = input("Parasta ennen pvm: ")

#-----ALKAA Lisätään appendilla uusi tuote mukaaan-------------------

#Lisätään uusi tuote List:aan

uusiTuote = {"tuote": tuote, "valmistaja": valmistaja}

if tuote != "0" and valmistaja != "0": #Näin blokkaat pois sen, että nollat tallentuisivat uutena karkkina ja uutena valmistajana!

    List.append(uusiTuote)

#-----LOPPUU Lisätään appendilla uusi tuote mukaan-------------------

tiedosto = open("karkkikauppa.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden

#tiedoston avaaminen kirjoittamista varten.

#Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.

tiedosto.write(tuote + "\n")

tiedosto.write(valmistaja + "\n")

#tiedosto.write(parasta_ennen_pvm + "\n")

tiedosto.close() #Tiedoston sulkeminen.

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


while True:


    print("Anna valitsemasi karkin nimi, niin tulostan sen, jos se löytyy karkkikaupasta.")

    print("Komennolla Kaikki tulostetaan kaikki karkkikaupan karkit.")

    print("Komennolla Poista poistetaan valitsemasi karkkikaupan karkki.")

    print("Komennolla Poistu, tämä ohjelma loppuu.")


    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 karkkikaupan karkkien tulostaminen.

        for x in List:

            print(x["tuote"])

            print(x["valmistaja"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

    elif onkoTuotetta(valinta): #Tulostaa pyydetyn karkin, jos se on karkkikaupassa.

        print(getTuote(valinta))


    elif valinta == "Poista": #Poistaa pyydetyn karkin karkkikaupasta.

      poistettava = input ("Minkä karkin haluat poistaa? ")

      for i in range(len(List)):

        if List['tuote'] == poistettava:

          del List

          break

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

    else:

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

tiedosto.close() #Suljetaan tiedosto.[CODE=python]
[/CODE]
 
Viimeksi muokattu:
Editois toi viestisi niin että laitat koodin koodi-elementin sisään niin tosta saa selvän :)
 
Mikäs ohjelmointikurssin tehtävä tämä on? Ihan kuin viimeisen vuoden aikana olisi hyvinkin samanlainen tehtävä ollut tällä alueella käsittelyssä.
 
Mikäs ohjelmointikurssin tehtävä tämä on? Ihan kuin viimeisen vuoden aikana olisi hyvinkin samanlainen tehtävä ollut tällä alueella käsittelyssä.

Ei tämä ole minkään kurssin tehtävä. Siis oikeastiko myös karkkikauppa? Tallentava karkkikauppa? :hmm:

Itse asiassa olen aloittanut tätä harjoitustani jo toukokuussa 2020. Ei taida kyllä olla kurssia, jossa voisi näin pitkään venyttää yhden pienen tehtävän palautusta??? Luokalleen kait siinä jäisi... :rolleyes: Muistaisitko sinä sitä minun keväällä kysymääni? Sinulla on tosi hyvä muisti! ;)
 
Viimeksi muokattu:
Aa... nyt kun kaiveli alueen ketjuja niin löytyi sun aikaisempikin keskusteluketju. Täällä vaan jonkun verran kysellään kaikenlaisien koulutöiden ratkaisuja ja tämä vähän vaikutti sen tyyliseltä hommalta ja vielä kun muisti että jotain karkkikauppajuttua pythonilla vuoden sisällä on käsitelty niin pisti epäilyttämään.
 
Voihan vietävä...

Oma Karkkikauppani toimii siis siten, että se ei tallenna..., muuten hyvin! Osaisiko joku muistuttaa mieleeni, että kuinka se tallennus .txt-tiedostoon tapahtui? Ei siis mitään hienoa, sillä en ehkä silloin ymmärrä..., ihan karkki.txt on toiveena.



Python:
"""

herkku1 = {”tuote”:”Fasu”, ”valmistaja”:”Fazer”}

herkku2 = {”tuote”:”Suukko”, ”valmistaja”:”Brunberg”}

herkku3 = {”tuote”:”Lakupala”, ”valmistaja”:”Panda”}

"""

List = [{"tuote":"Fasu", "valmistaja":"Fazer"},{"tuote":"Suukko", "valmistaja":"Brunberg"},{"tuote":"Lakupala", "valmistaja":"Panda"}]

#-----ALKAA Funktioiden esittely, joita tarvitaan myöhemmin----------

#Näitä kahta funktiota tarvitaan, kun etsitään, onko Karkkikaupassa kysyttyä tuotetta...

#Etsitään onko List:ssä tuotetta tuote

def onkoTuotetta(tuote):

    for x in List:

        if x["tuote"]==tuote: return True

    return False

#Etsitään tuote List:stä ja palautetaan se

def getTuote(tuote):

    for x in List:

        if x["tuote"]==tuote: return x

    return None

#-----LOPPUU Funktioiden esittely, joita tarvitaan myöhemmin---------

print("Tervetuloa Karkkikauppaan!", "\n" , "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.

"Uuden tuotteen lisäys karkkikauppaan:" ,"\n"

"Jos et nyt halua lisätä tuotetta, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")

tuote = input("Karkin nimi: ")

valmistaja = input("Valmistajan nimi: ")

#parasta_ennen_pvm = input("Parasta ennen pvm: ")

#-----ALKAA Lisätään appendilla uusi tuote mukaaan-------------------

#Lisätään uusi tuote List:aan

uusiTuote = {"tuote": tuote, "valmistaja": valmistaja}

if tuote != "0" and valmistaja != "0": #Näin blokkaat pois sen, että nollat tallentuisivat uutena karkkina ja uutena valmistajana!

    List.append(uusiTuote)

#-----LOPPUU Lisätään appendilla uusi tuote mukaan-------------------

tiedosto = open("karkkikauppa.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden

#tiedoston avaaminen kirjoittamista varten.

#Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.

tiedosto.write(tuote + "\n")

tiedosto.write(valmistaja + "\n")

#tiedosto.write(parasta_ennen_pvm + "\n")

tiedosto.close() #Tiedoston sulkeminen.

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


while True:


    print("Anna valitsemasi karkin nimi, niin tulostan sen, jos se löytyy karkkikaupasta.")

    print("Komennolla Kaikki tulostetaan kaikki karkkikaupan karkit.")

    print("Komennolla Poista poistetaan valitsemasi karkkikaupan karkki.")

    print("Komennolla Poistu, tämä ohjelma loppuu.")


    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 karkkikaupan karkkien tulostaminen.

        for x in List:

            print(x["tuote"])

            print(x["valmistaja"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

    elif onkoTuotetta(valinta): #Tulostaa pyydetyn karkin, jos se on karkkikaupassa.

        print(getTuote(valinta))


    elif valinta == "Poista": #Poistaa pyydetyn karkin karkkikaupasta.

      poistettava = input ("Minkä karkin haluat poistaa? ")

      for i in range(len(List)):

        if List['tuote'] == poistettava:

          del List

          break

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

    else:

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

tiedosto.close() #Suljetaan tiedosto.[CODE=python]
[/CODE]
Voihan vietävä...

Oma Karkkikauppani toimii siis siten, että se ei tallenna..., muuten hyvin! Osaisiko joku muistuttaa mieleeni, että kuinka se tallennus .txt-tiedostoon tapahtui? Ei siis mitään hienoa, sillä en ehkä silloin ymmärrä..., ihan karkki.txt on toiveena.



Python:
"""

herkku1 = {”tuote”:”Fasu”, ”valmistaja”:”Fazer”}

herkku2 = {”tuote”:”Suukko”, ”valmistaja”:”Brunberg”}

herkku3 = {”tuote”:”Lakupala”, ”valmistaja”:”Panda”}

"""

List = [{"tuote":"Fasu", "valmistaja":"Fazer"},{"tuote":"Suukko", "valmistaja":"Brunberg"},{"tuote":"Lakupala", "valmistaja":"Panda"}]

#-----ALKAA Funktioiden esittely, joita tarvitaan myöhemmin----------

#Näitä kahta funktiota tarvitaan, kun etsitään, onko Karkkikaupassa kysyttyä tuotetta...

#Etsitään onko List:ssä tuotetta tuote

def onkoTuotetta(tuote):

    for x in List:

        if x["tuote"]==tuote: return True

    return False

#Etsitään tuote List:stä ja palautetaan se

def getTuote(tuote):

    for x in List:

        if x["tuote"]==tuote: return x

    return None

#-----LOPPUU Funktioiden esittely, joita tarvitaan myöhemmin---------

print("Tervetuloa Karkkikauppaan!", "\n" , "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.

"Uuden tuotteen lisäys karkkikauppaan:" ,"\n"

"Jos et nyt halua lisätä tuotetta, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")

tuote = input("Karkin nimi: ")

valmistaja = input("Valmistajan nimi: ")

#parasta_ennen_pvm = input("Parasta ennen pvm: ")

#-----ALKAA Lisätään appendilla uusi tuote mukaaan-------------------

#Lisätään uusi tuote List:aan

uusiTuote = {"tuote": tuote, "valmistaja": valmistaja}

if tuote != "0" and valmistaja != "0": #Näin blokkaat pois sen, että nollat tallentuisivat uutena karkkina ja uutena valmistajana!

    List.append(uusiTuote)

#-----LOPPUU Lisätään appendilla uusi tuote mukaan-------------------

tiedosto = open("karkkikauppa.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden

#tiedoston avaaminen kirjoittamista varten.

#Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.

tiedosto.write(tuote + "\n")

tiedosto.write(valmistaja + "\n")

#tiedosto.write(parasta_ennen_pvm + "\n")

tiedosto.close() #Tiedoston sulkeminen.

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


while True:


    print("Anna valitsemasi karkin nimi, niin tulostan sen, jos se löytyy karkkikaupasta.")

    print("Komennolla Kaikki tulostetaan kaikki karkkikaupan karkit.")

    print("Komennolla Poista poistetaan valitsemasi karkkikaupan karkki.")

    print("Komennolla Poistu, tämä ohjelma loppuu.")


    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 karkkikaupan karkkien tulostaminen.

        for x in List:

            print(x["tuote"])

            print(x["valmistaja"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

    elif onkoTuotetta(valinta): #Tulostaa pyydetyn karkin, jos se on karkkikaupassa.

        print(getTuote(valinta))


    elif valinta == "Poista": #Poistaa pyydetyn karkin karkkikaupasta.

      poistettava = input ("Minkä karkin haluat poistaa? ")

      for i in range(len(List)):

        if List['tuote'] == poistettava:

          del List

          break

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

    else:

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

tiedosto.close() #Suljetaan tiedosto.[CODE=python]
[/CODE]
Ja Pythoniahan olen tässä harjoitellut... :)
Taisin onnistua! Ja tuo koodi siis toimii tuollaisenakin, mutta olisi kiva osata myös tallentaa tekstitiedostoon tehdyt muutokset!
;)
 
Ei suinkaan, täältä löytyy selkeät oppaat:
 
Joo, tuo tiedoston luku ja tiedostoon kirjoitushan on Pythonilla hyvin simppeliä. Ehkä tossa kyseissä tehtävässä haaste on enemmänkin miettiä sitä, miten tiedoston käsittely toteutetaan, ts. milloin tietoa luetaan ja milloin kirjoitetaan.

Esim. täällä paikallisessa yliopistossa vastaavat tiedostotallennuksen päällä pyörivät peruskurssitoteutukset toimivat yleensä logiikalla

* sovellus avataan -> sovelluksen tiedot luetaan tiedostosta muistiin
* sovellusta käytetään -> muistissa olevia tietoja muokataan
* halutaan tallentaa tai lopetetaan -> muistissa olevat tiedot kirjoitetaan tiedostoon

En jaksanut alkaa lukemaan tarkemmin tuon kirjoitetun koodin logiikkaa, mutta tiedoston käsittely on kohtuullisen suoraviivaista toteuttaa omaksi funktiokseen, jota voi sen jälkeen kutsua tuon while True -rakenteen sisällä omalla valinnallaan, kun halutaan tallentaa.

(Sitten jos halutaan tehdä niin, että kaikki tietorakenteisiin tehdyt muutokset tallennetaan sitä mukaa kuin niitä tehdään, niin kannattaa minusta jo melkein vaihtaa tiedosto tietokannaksi, mutta kantojen kanssa tulee niin paljon kaikenlaista uutta veivattavaa, ettei kannata ihan alkuvaiheessa vielä sotkea itseään niillä.)

Tää kannattaa minusta vilkaista ja omaksua tiedostojen käsittelyssä het alkuunsa: with statement in Python - GeeksforGeeks

Tuon kanssa tiedostoa ei tarvitse muistaa sulkea erikseen käsittelyn jälkeen, eikä sulkemista pääse unohtamaan vahingossa.

muoks. tuo sama näköjään Moocin ohjeissa. Ei kannata sit tuolla toisella sivulla seikkaillakaan.
 
Viimeksi muokattu:
Sitten pythonissa oli joku kiva valmis palikka jolla sai helposti jonkun listan tai taulukon kirjoitettua tiedostoon ja luettua sieltä takaisin. Taisi olla pickle, tuolla siis saa simppelisti kerralla tallennettua kaikki karkit yhteen tiedostoon ja vastaavasti ladattua takaisin ohjelmaan: UsingPickle - Python Wiki
 
Sitten pythonissa oli joku kiva valmis palikka jolla sai helposti jonkun listan tai taulukon kirjoitettua tiedostoon ja luettua sieltä takaisin. Taisi olla pickle, tuolla siis saa simppelisti kerralla tallennettua kaikki karkit yhteen tiedostoon ja vastaavasti ladattua takaisin ohjelmaan: UsingPickle - Python Wiki


Kokeilen tuota Pickleaä, se tuntuu minulle tarpeeksi yksinkertaiselta... ;) Katsotaan, kuinka käy!
 
Itse käyttäisin pythonin omaa csv-moduulia. Mielestäni suht selkeä documentaatio kohdissa csv writer ja reader tuossa aika alussa. Jos tiedoston luonti ylipäänsä uutta asiaa niin katso vaikka w3schools sivu aiheesta. Ei tuossa picklessäkään sinänsä mitään vikaa ole. Kielen omat moduulit sillä tapaa parempia että on varmemmin turvallisia ja ylläpidettyjä jos joskus tulevaisuudessa pitää samantapainen temppu tehdä.
edit. Oho picklehän olikin pythonin virallinen moduuli. Nimi vain hämäsi. Käytä siis ihmeessä kumpaa haluat!
 
Kokeilen tuota Pickleaä, se tuntuu minulle tarpeeksi yksinkertaiselta... ;) Katsotaan, kuinka käy!

Entä JSON laajennoksen käyttäminen, tallentaa ainakin teksti -muodossa, ja niin ollen muokattavissa millä tahansa tekstieditorilla, kun taas pickle tallentaa binääri muodossa, ja sen muokkaaminen ei olekaan niin helppoa muilla editoreilla.

Python:
import json
import os


def SaveList(List, FileName):
    jsonString = json.dumps(List)
    jsonFile = open(FileName, "w")
    jsonFile.write(jsonString)
    jsonFile.close()


def LoadList(FileName):
    if os.path.isfile(FileName):
        List=[]
        fileObject = open(FileName, "r")
        jsonContent = fileObject.read()
        List = json.loads(jsonContent)
        return List
 
Entä JSON laajennoksen käyttäminen, tallentaa ainakin teksti -muodossa, ja niin ollen muokattavissa millä tahansa tekstieditorilla, kun taas pickle tallentaa binääri muodossa, ja sen muokkaaminen ei olekaan niin helppoa muilla editoreilla.

Python:
import json
import os


def SaveList(List, FileName):
    jsonString = json.dumps(List)
    jsonFile = open(FileName, "w")
    jsonFile.write(jsonString)
    jsonFile.close()


def LoadList(FileName):
    if os.path.isfile(FileName):
        List=[]
        fileObject = open(FileName, "r")
        jsonContent = fileObject.read()
        List = json.loads(jsonContent)
        return List

Taidan yrittää vielä tätäkin... :hmm:
 
Taidan yrittää vielä tätäkin... :hmm:
Miten sulla on se tuorein koodi, millä yrität kirjoittaa tiedostoon? Kaatuuko ohjelma, mitään ei mene tiedostoon vai mikä on ongelmana?

Teet millä tahansa lisäosalla, niin ensin pitää tajuta, miten se tiedoston kirjoittaminen oikeasti toimii siinä sun ohjelmassa. Ja mitä tiedostoon ollaan milloinkin kirjoittamassa :) Sen jälkeen se on vaan tuon varsinaisen työkalun valitsemista ja mitä ominaisuuksia siitä pitää mihinkin tarpeeseen löytyä.
 
Juu, pistä koodia näkyviin kuinka olet yrittänyt niin katsellaan mikä siinä mättää. Tuota muuta koodia saattaa hieman joutua muuttelemaan että kirjoitus ja luku toimii järkevästi.
 
Tässä vielä yksi vaihtoehto, raakaa teksti formaattia. Tämän etu edelliseen nähden on pienempi tiedostokoko. En malttanut olla pistämättä vähän laajempaa mallia, josta jäi sinulle ratkottavaksi vain ratkaisujen ehostaminen ja edelleen kehittäminen. Kerropa mitä olet mieltä tällaisesta. Vinkkinä testatessasi tuote- tai valmistaja hakuja, yksi kirjain riittää tuottamaan tulosta jos se sattuu esiintymään kohteessa.
Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  main.py
#
#  Luotu malliksi dictionary listojen käsittelyyn.
#  Esimerkki kirjoitettu ja testattu Manjaro 20.2.1 ympäristössä.
#  Ohjelman laatijana en ota mitään vastuutta mistään, minkä
#  ohjelma suorittaminen saattaa aiheuttaa. Käytät ohjelmaa ja
#  sen osia täysin omalla vastuullasi.
#
#

import os
import ast
FileName="KARKIT.TXT"
Lista = [
{"tuote":"Fasu", "valmistaja":"Fazer"},
{"tuote":"Suukko", "valmistaja":"Brunberg"},
{"tuote":"Lakupala", "valmistaja":"Panda"}
]





def cls():
    os.system('cls' if os.name=='nt' else 'clear')





def SaveLista(Lista,FileName):
    f = open(FileName,"w")
    f.write( str(Lista) )
    f.close()
    print("\n\n")
    print("\tLista tallennettiin nimellä (" + FileName + ").")
    input("\tPaina jotain jatkaaksesi! ")




def LoadLista(FileName):
    if os.path.isfile(FileName):
        f = open(FileName,"r")
        data = f.read()
        Lista = ast.literal_eval(data)
        f.close()
        print("\n\n")
        print("\tLista ladattiin tiedostosta (" + FileName + ") onnistuneesti.")
        input("\tPaina jotain jatkaaksesi! ")
        return Lista





def TulostaLista(Lista):
    print('\n\n\tTUOTE         VALMISTAJA')
    for x in Lista:
        data = "\t" + x["tuote"]
        data = "{:<15}".format(data)
        data = data + x["valmistaja"]
        print(data)
  
    print("\n\n")
    print("\tLista tulostettiin onnistuneesti.")
    input("\tPaina jotain jatkaaksesi! ")





def HaetaanTuotteenValmistaja(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun tuotteen valmistaja (Enter=Exit).")
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "": break
        FoundLista=[]
        for x in Lista:
            if Tuote.lower() in x["tuote"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tTuotteella (" + Tuote + ") ei ole valmistajaa!" )
            input("\tPaina jotain jatkaaksesi! ")





def ListaaValmistajanTuotteet(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun valmistajan tuotteet (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "": break
        FoundLista=[]
        for x in Lista:
            if Valmistaja.lower() in x["valmistaja"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tValmistajalla (" + Valmistaja + ") ei ole tuotteita!" )
            input("\tPaina jotain jatkaaksesi! ")





def LisaaTuote(Lista):
    while True:
        cls()
        print("\n\n")
        print("\tLisätään uusi tuote listaan (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        Lista.append(NewItem)
  




def PoistaTuote(Lista):
    while True:
        cls()
        Found = False
        print("\n\n")
        print("\tPoistetaan nimetty tuote (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        for x in range(len(Lista)):
            if Lista[x] == NewItem:
                Lista.pop(x)
                Found = True
                break
        if Found == False:
            print("\n\tValmistaa (" + Valmistaja + "), tai tuotetta (" + Tuote + ") ei ole!" )
            input("\tPaina jotain jatkaaksesi! ")





def menu():
    global Lista
    while True:
        cls()
        print ("\n\n\t")
        print ("\t1. Hae tuotteelle valmistajaa.")
        print ("\t2. Listaa valmistajan tuotteet.")
        print ("\t3. Lataa lista levyltä.")
        print ("\t4. Tallenna lista levylle.")
        print ("\t5. Tulosta tuotelista.")
        print ("\t6. Lisää tuote")
        print ("\t7. Poista tuote")
        print ("\t8. Lopetus")
  
        valinta = input('\n\tAnna valintasi [1-8] : ')
        if valinta      == "1": cls(); HaetaanTuotteenValmistaja(Lista)
        elif valinta == "2": cls(); ListaaValmistajanTuotteet(Lista)
        elif valinta == "3": cls(); Lista=LoadLista(FileName)
        elif valinta == "4": cls(); SaveLista(Lista,FileName)
        elif valinta == "5": cls(); TulostaLista(Lista)
        elif valinta == "6": cls(); Lista=LisaaTuote(Lista)
        elif valinta == "7": cls(); Lista=PoistaTuote(Lista)
        elif valinta == "8": break

menu()
Pääte_295.png
Monta kohtaa voidaan tehdä fiksummin, esimerkiksi tuossa tuon tuotteen poisto, tapahtuu nyt yksin kappalein, tässä voitaisiin ottaa korvausmerkit avuksi vaikka niin että kun käyttäjältä on kysytty poistettavan tuotteen valmistaja, käyttäjä voisi antaa tuotteeksi * merkin, jolloin poistettaisiin kaikki valmistajan tuotteet, tai toisin päin, annettaisiin tuote, mutta valmistaja korvattaisiin * merkillä, jolloin kaikilta valmistajilta poistettaisiin kyseinen tuote.

Edellisen lisäksi, esimerkissä ei tuotelistaa tallenneta poistuessa automaattisesti, tässä olisi hyvä varmistaa että haluaako käyttäjä tosiaankin poistua tallentamatta tehtyjä muutoksia. Niin ja väreillä saataisiin ohjelmasta merkittävästi fiksumman näköinen. jne.
 
Viimeksi muokattu:
Tässä vielä yksi vaihtoehto, raakaa teksti formaattia. Tämän etu edelliseen nähden on pienempi tiedostokoko. En malttanut olla pistämättä vähän laajempaa mallia, josta jäi sinulle ratkottavaksi vain ratkaisujen ehostaminen ja edelleen kehittäminen. Kerropa mitä olet mieltä tällaisesta. Vinkkinä testatessasi tuote- tai valmistaja hakuja, yksi kirjain riittää tuottamaan tulosta jos se sattuu esiintymään kohteessa.
Python:
#!/usr/bin/env python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  main.py
#
#  Luotu malliksi dictionary listojen käsittelyyn.
#  Esimerkki kirjoitettu ja testattu Manjaro 20.2.1 ympäristössä.
#  Ohjelman laatijana en ota mitään vastuutta mistään, minkä
#  ohjelma suorittaminen saattaa aiheuttaa. Käytät ohjelmaa ja
#  sen osia täysin omalla vastuullasi.
#
#

import os
import ast
FileName="KARKIT.TXT"
Lista = [
{"tuote":"Fasu", "valmistaja":"Fazer"},
{"tuote":"Suukko", "valmistaja":"Brunberg"},
{"tuote":"Lakupala", "valmistaja":"Panda"}
]





def cls():
    os.system('cls' if os.name=='nt' else 'clear')





def SaveLista(Lista,FileName):
    f = open(FileName,"w")
    f.write( str(Lista) )
    f.close()
    print("\n\n")
    print("\tLista tallennettiin nimellä (" + FileName + ").")
    input("\tPaina jotain jatkaaksesi! ")




def LoadLista(FileName):
    if os.path.isfile(FileName):
        f = open(FileName,"r")
        data = f.read()
        Lista = ast.literal_eval(data)
        f.close()
        print("\n\n")
        print("\tLista ladattiin tiedostosta (" + FileName + ") onnistuneesti.")
        input("\tPaina jotain jatkaaksesi! ")
        return Lista





def TulostaLista(Lista):
    print('\n\n\tTUOTE         VALMISTAJA')
    for x in Lista:
        data = "\t" + x["tuote"]
        data = "{:<15}".format(data)
        data = data + x["valmistaja"]
        print(data)

    print("\n\n")
    print("\tLista tulostettiin onnistuneesti.")
    input("\tPaina jotain jatkaaksesi! ")





def HaetaanTuotteenValmistaja(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun tuotteen valmistaja (Enter=Exit).")
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "": break
        FoundLista=[]
        for x in Lista:
            if Tuote.lower() in x["tuote"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tTuotteella (" + Tuote + ") ei ole valmistajaa!" )
            input("\tPaina jotain jatkaaksesi! ")





def ListaaValmistajanTuotteet(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun valmistajan tuotteet (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "": break
        FoundLista=[]
        for x in Lista:
            if Valmistaja.lower() in x["valmistaja"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tValmistajalla (" + Valmistaja + ") ei ole tuotteita!" )
            input("\tPaina jotain jatkaaksesi! ")





def LisaaTuote(Lista):
    while True:
        cls()
        print("\n\n")
        print("\tLisätään uusi tuote listaan (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        Lista.append(NewItem)





def PoistaTuote(Lista):
    while True:
        cls()
        Found = False
        print("\n\n")
        print("\tPoistetaan nimetty tuote (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        for x in range(len(Lista)):
            if Lista[x] == NewItem:
                Lista.pop(x)
                Found = True
                break
        if Found == False:
            print("\n\tValmistaa (" + Valmistaja + "), tai tuotetta (" + Tuote + ") ei ole!" )
            input("\tPaina jotain jatkaaksesi! ")





def menu():
    global Lista
    while True:
        cls()
        print ("\n\n\t")
        print ("\t1. Hae tuotteelle valmistajaa.")
        print ("\t2. Listaa valmistajan tuotteet.")
        print ("\t3. Lataa lista levyltä.")
        print ("\t4. Tallenna lista levylle.")
        print ("\t5. Tulosta tuotelista.")
        print ("\t6. Lisää tuote")
        print ("\t7. Poista tuote")
        print ("\t8. Lopetus")

        valinta = input('\n\tAnna valintasi [1-8] : ')
        if valinta      == "1": cls(); HaetaanTuotteenValmistaja(Lista)
        elif valinta == "2": cls(); ListaaValmistajanTuotteet(Lista)
        elif valinta == "3": cls(); Lista=LoadLista(FileName);
        elif valinta == "4": cls(); SaveLista(Lista,FileName);
        elif valinta == "5": cls(); TulostaLista(Lista)
        elif valinta == "6": cls(); Lista=LisaaTuote(Lista)
        elif valinta == "7": cls(); Lista=PoistaTuote(Lista)
        elif valinta == "8": break

menu()
Pääte_295.png
Monta kohtaa voidaan tehdä fiksummin, esimerkiksi tuossa tuon tuotteen poisto, tapahtuu nyt yksin kappalein, tässä voitaisiin ottaa korvausmerkit avuksi vaikka niin että kun käyttäjältä on kysytty poistettavan tuotteen valmistaja, käyttäjä voisi antaa tuotteeksi * merkin, jolloin poistettaisiin kaikki valmistajan tuotteet, tai toisin päin, annettaisiin tuote, mutta valmistaja korvattaisiin * merkillä, jolloin kaikilta valmistajilta poistettaisiin kyseinen tuote.

Edellisen lisäksi, esimerkissä ei tuotelistaa tallenneta poistuessa automaattisesti, tässä olisi hyvä varmistaa että haluaako käyttäjä tosiaankin poistua tallentamatta tehtyjä muutoksia. Niin ja väreillä saataisiin ohjelmasta merkittävästi fiksumman näköinen. jne.

Tämä oli kyllä hieno :), erittäin selkeän oloinen ja tallentaa juuri sille .txt:lle, mutta en saanut ainakaan noita kohtia 3 ja 4 toimimaan eilen... en tosin kokeillut käskykehoitteessa, vaan Visual Studio Codessa. Kokeilen vielä tänään lisää, kun on paremmin aikaa... :hmm:

Ja nyt olet vielä lisännyt koodia aiempaan..., katsotaas...

Nyt toimivat, ei herja enää kohtia 3 ja 4, mutta ei silti tallennu... katson kotona illemmalla tarkemmin!
 
Viimeksi muokattu:
Tämä oli kyllä hieno :), erittäin selkeän oloinen ja tallentaa juuri sille .txt:lle, mutta en saanut ainakaan noita kohtia 3 ja 4 toimimaan eilen...

Noihin oli jäänyt puolipisteet ";" rivin loppuun, poistin ne, niitä ei tarvita. Sinulla varmaan se Visual Studio Code merkkaa ne (rivit 183 ja 184) huomautuksella, mutta python tulkki ei niistä välitä, eli komentokehotteesta käsin ajettuna toimisi niidenkin kanssa. Noita ylimääräisiä puolipisteitä jää usein siitä syystä että kirjoittelen myös pascal koodia, jonka syntaksiin kuuluu rivien päättäminen puolipisteeseen.
 
Viimeksi muokattu:
Noihin oli jäänyt puolipisteet ";" rivin loppuun, poistin ne, niitä ei tarvita. Sinulla varmaan se Visual Studio Code merkkaa ne (rivit 183 ja 184) huomautuksella, mutta python tulkki ei niistä välitä, eli komentokehotteesta käsin ajettuna toimisi niidenkin kanssa. Noita ylimääräisiä puolipisteitä jää usein siitä syystä että kirjoittelen myös pascal koodia, jonka syntaksiin kuuluu rivien päättäminen puolipisteeseen.

Jep, puolipisteet poistin, mutta en keksi, mikä voi olla, että se ei tallenna minulla sinne KARKIT.TXT:lle... Se siis kohdissa 3 ja 4 ei edes herjaa, vaan 'sanoo, että kaikki on ok' ja ei kuitenkaan tallenna... Olen katsonut ja katsonut ohjeeksi toista koodia, jossa tallennetaan ja en keksi, mikä ero on... Herjaisi edes, niin voisi yrittää korjata... :(
 
Noihin oli jäänyt puolipisteet ";" rivin loppuun, poistin ne, niitä ei tarvita. Sinulla varmaan se Visual Studio Code merkkaa ne (rivit 183 ja 184) huomautuksella, mutta python tulkki ei niistä välitä, eli komentokehotteesta käsin ajettuna toimisi niidenkin kanssa. Noita ylimääräisiä puolipisteitä jää usein siitä syystä että kirjoittelen myös pascal koodia, jonka syntaksiin kuuluu rivien päättäminen puolipisteeseen.
Ite duunikielenä pääasiassa Java, niin puolipisteitä tekis mieli työntää joka paikkaa. Kuin myös alustaa muuttujat tyypillä. Saa jatkuvasti korjailla itteensä, kun pitää Pythonilla jotain kirjoitella :D

Jep, puolipisteet poistin, mutta en keksi, mikä voi olla, että se ei tallenna minulla sinne KARKIT.TXT:lle... Se siis kohdissa 3 ja 4 ei edes herjaa, vaan 'sanoo, että kaikki on ok' ja ei kuitenkaan tallenna... Olen katsonut ja katsonut ohjeeksi toista koodia, jossa tallennetaan ja en keksi, mikä ero on... Herjaisi edes, niin voisi yrittää korjata... :(
Pistä sitä koodia nähtäville, niin on kaikkien helpompi sanoa, missä mättää. Ei sitä muuten kukaan osaa arvata, missä vika on :D

Ja mitä nyt ainakin voit tehdä, niin erota debuggausta varten se tiedostoon kirjoittaminen ihan omaksi python-tiedostoksi ja tarkista vaikka siellä, että tiedostoon kirjoittaminen toimii. Sen jälkeen voit ottaa sen toimivan funktion ja siirtää sen tohon karkkikauppatoteutukseen. Koodi nyt siis testaukseen vaikka jotain seuraavaa:

Koodi:
# Write contents of a list to a file
def save(list, pathToFile):
    with open(pathToFile, "w") as file:
        for item in list:
            file.write("%s\n" % item)

    
path = "C:\minnankoodit\tiedosto.txt"
list = ["a", "b", "c"]

save(list, path)

Tuolla nyt voi olla jotain syntaksihöpönlöpöä, kun kirjoittelen taas kesken töiden, mutta ajatuksen saa varmaan selville. Jos tuo toimii, niin sulla on em. polun tiedostossa kolme peräkkäistä riviä, joilla on a, b, ja c.

Ja kannattaa kattoa omasta koodista, minkä parametrin oot antanu tuolle tiedoston avaavalle funktiolle eli onko se 'a' niin kuin append vai 'w' niin kuin write. Toinen kirjoittaa tiedoston kokonaan uusiksi (ja poistaa kaiken vanhan datan) ja toinen kirjoittelee / lisää uutta vanhan tiedostosisällön perään.
 
Jep, puolipisteet poistin, mutta en keksi, mikä voi olla, että se ei tallenna minulla sinne KARKIT.TXT:lle... Se siis kohdissa 3 ja 4 ei edes herjaa, vaan 'sanoo, että kaikki on ok' ja ei kuitenkaan tallenna... Olen katsonut ja katsonut ohjeeksi toista koodia, jossa tallennetaan ja en keksi, mikä ero on... Herjaisi edes, niin voisi yrittää korjata... :(
 
Viimeksi muokattu:
Kuinka totesit ettei tallenna. Tiedostohan on yksi rivinen *.TXT -muodossa oleva ja uusin lisäys menee sinne rivin hännille. Jollei "Muistiosi" rivitä sisältöään, jää sinulta rivin loppu pää näkemättä.
 
Kuinka totesit ettei tallenna. Tiedostohan on yksi rivinen *.TXT -muodossa oleva ja uusin lisäys menee sinne rivin hännille. Jollei "Muistiosi" rivitä sisältöään, jää sinulta rivin loppu pää näkemättä.

Kas kun lisäys onnistuu nätisti, esim Marimintin lisäys kuten alla:

Fasu Fazer
Suukko Brunberg
Lakupala Panda
Marimint Fazer

Mutta kun suljen koko toteutuksen (main.py) ja avaan uudellen, niin Marimint on kadonnut..., vaikka olen sitä ennen valinnut myös: 4. Tallenna lista levylle.

Pitääkö se .txt-tiedosto jotenkin 'alustaa' ennen käyttöä??? :cry:
 
Viimeksi muokattu:
Mutta kun suljen koko toteutuksen (main.py) ja avaan uudellen, niin Marimint on kadonnut..., vaikka olen sitä ennen valinnut myös: 4. Tallenna lista levylle.

Kun listaa muutetaan, joko lisätään tai poistetaan, täytyy se tallentaa ennen lopetusta.
Samoin kun käynnistät ohjelman, täytyy sinun ensimmäiseksi ladata lista levyltä, muutoin työskentelet sen "siemenlistan" kanssa.

TÄSTÄ ALKAA SINUN OSUUS OHJELMAN KEHITTÄJÄNÄ
Tässä on sinulle sitä kehityksen sarkaa, lisäät koodin, joka tarkistaa, onko lista levyltä ladattavissa, vai käytetäänkö sitä siemenlistaa. Samoin lisää siihen lopetukseen listan tallennustarpeen tarkastaja, joka kysyy poistuttaessa tallennetaanko listan muutokset mikäli se on aiheellinen kysyä.
 
Viimeksi muokattu:
Kun listaa muutetaan, joko lisätään tai poistetaan, täytyy se tallentaa ennen lopetusta.
Samoin kun käynnistät ohjelman, täytyy sinun ensimmäiseksi ladata lista levyltä, muutoin työskentelet sen "siemenlistan" kanssa.

TÄSTÄ ALKAA SINUN OSUUS OHJELMAN KEHITTÄJÄNÄ
Tässä on sinulle sitä kehityksen sarkaa, lisäät koodin, joka tarkistaa, onko lista levyltä ladattavissa, vai käytetäänkö sitä siemenlistaa. Samoin lisää siihen lopetukseen listan tallennustarpeen tarkastaja, joka kysyy poistuttaessa tallennetaanko listan muutokset mikäli se on aiheellinen kysyä.

Ok, yritän viikonloppuna työstää tätä (ja nauratta teitä! ;))
 
Python:
#!/usr/bin/env python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  main.py
#
#  Luotu malliksi dictionary listojen käsittelyyn.
#  Esimerkki kirjoitettu ja testattu Manjaro 20.2.1 ympäristössä.
#  Ohjelman laatijana en ota mitään vastuutta mistään, minkä
#  ohjelma suorittaminen saattaa aiheuttaa. Käytät ohjelmaa ja
#  sen osia täysin omalla vastuullasi.
#
#

import os
import ast
FileName="KARKIT.TXT"
Lista = [
{"tuote":"Fasu", "valmistaja":"Fazer"},
{"tuote":"Suukko", "valmistaja":"Brunberg"},
{"tuote":"Lakupala", "valmistaja":"Panda"}

]





def cls():
    os.system('cls' if os.name=='nt' else 'clear')





def SaveLista(Lista,FileName):
    f = open(FileName,"w")
    f.write( str(Lista) )
    f.close()
    print("\n\n")
    print("\tLista tallennettiin nimellä (" + FileName + ").")
    input("\tPaina jotain jatkaaksesi! ")




def LoadLista(FileName):
    if os.path.isfile(FileName):
        f = open(FileName,"r")
        data = f.read()
        Lista = ast.literal_eval(data)
        f.close()
        print("\n\n")
        print("\tLista ladattiin tiedostosta (" + FileName + ") onnistuneesti.")
        input("\tPaina jotain jatkaaksesi! ")
        return Lista





def TulostaLista(Lista):
    print('\n\n\tTUOTE         VALMISTAJA')
    for x in Lista:
        data = "\t" + x["tuote"]
        data = "{:<15}".format(data)
        data = data + x["valmistaja"]
        print(data)

    print("\n\n")
    print("\tLista tulostettiin onnistuneesti.")
    input("\tPaina jotain jatkaaksesi! ")





def HaetaanTuotteenValmistaja(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun tuotteen valmistaja (Enter=Exit).")
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "": break
        FoundLista=[]
        for x in Lista:
            if Tuote.lower() in x["tuote"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tTuotteella (" + Tuote + ") ei ole valmistajaa!" )
            input("\tPaina jotain jatkaaksesi! ")





def ListaaValmistajanTuotteet(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun valmistajan tuotteet (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "": break
        FoundLista=[]
        for x in Lista:
            if Valmistaja.lower() in x["valmistaja"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tValmistajalla (" + Valmistaja + ") ei ole tuotteita!" )
            input("\tPaina jotain jatkaaksesi! ")





def LisaaTuote(Lista):
    while True:
        cls()
        print("\n\n")
        print("\tLisätään uusi tuote listaan (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        Lista.append(NewItem)

#***

#Tallentaa kysytyt tiedot tiedostoon KARKIT.txt
FileName = open("KARKIT.txt", "w") #Avaa tiedosto kirjoittamista varten. 

#Kirjoita ylla luetut tiedot tiedostoon riveittain.
FileName.write("tuote" + "\n")
FileName.write("valmistaja" + "\n")

FileName.close() #Sulje tiedosto.

FileName = open("KARKIT.txt", "r") #Avataan tiedosto lukemista varten.

while True:
    rivi = FileName.readline() #Luetaan tiedostosta rivi.
    if len(rivi) == 0:
        break
    print(rivi, end = "")

FileName.close() #Suljetaan tiedosto.

#***

def PoistaTuote(Lista):
    while True:
        cls()
        Found = False
        print("\n\n")
        print("\tPoistetaan nimetty tuote (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        for x in range(len(Lista)):
            if Lista[x] == NewItem:
                Lista.pop(x)
                Found = True
                break
        if Found == False:
            print("\n\tValmistaa (" + Valmistaja + "), tai tuotetta (" + Tuote + ") ei ole!" )
            input("\tPaina jotain jatkaaksesi! ")





def menu():
    global Lista
    while True:
        cls()
        print ("\n\n\t")
        print ("\t1. Hae tuotteelle valmistajaa.")
        print ("\t2. Listaa valmistajan tuotteet.")
        print ("\t3. Lataa lista levyltä.")
        print ("\t4. Tallenna lista levylle.")
        print ("\t5. Tulosta tuotelista.")
        print ("\t6. Lisää tuote")
        print ("\t7. Poista tuote")
        print ("\t8. Lopetus")

        valinta = input('\n\tAnna valintasi [1-8] : ')
        if valinta      == "1": cls(); HaetaanTuotteenValmistaja(Lista)
        elif valinta == "2": cls(); ListaaValmistajanTuotteet(Lista)
        elif valinta == "3": cls(); Lista=LoadLista(FileName)
        elif valinta == "4": cls(); SaveLista(Lista,FileName)
        elif valinta == "5": cls(); TulostaLista(Lista)
        elif valinta == "6": cls(); Lista=LisaaTuote(Lista)
        elif valinta == "7": cls(); Lista=PoistaTuote(Lista)
        elif valinta == "8": break

menu()
 
Python:
#!/usr/bin/env python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  main.py
#
#  Luotu malliksi dictionary listojen käsittelyyn.
#  Esimerkki kirjoitettu ja testattu Manjaro 20.2.1 ympäristössä.
#  Ohjelman laatijana en ota mitään vastuutta mistään, minkä
#  ohjelma suorittaminen saattaa aiheuttaa. Käytät ohjelmaa ja
#  sen osia täysin omalla vastuullasi.
#
#

import os
import ast
FileName="KARKIT.TXT"
Lista = [
{"tuote":"Fasu", "valmistaja":"Fazer"},
{"tuote":"Suukko", "valmistaja":"Brunberg"},
{"tuote":"Lakupala", "valmistaja":"Panda"}

]





def cls():
    os.system('cls' if os.name=='nt' else 'clear')





def SaveLista(Lista,FileName):
    f = open(FileName,"w")
    f.write( str(Lista) )
    f.close()
    print("\n\n")
    print("\tLista tallennettiin nimellä (" + FileName + ").")
    input("\tPaina jotain jatkaaksesi! ")




def LoadLista(FileName):
    if os.path.isfile(FileName):
        f = open(FileName,"r")
        data = f.read()
        Lista = ast.literal_eval(data)
        f.close()
        print("\n\n")
        print("\tLista ladattiin tiedostosta (" + FileName + ") onnistuneesti.")
        input("\tPaina jotain jatkaaksesi! ")
        return Lista





def TulostaLista(Lista):
    print('\n\n\tTUOTE         VALMISTAJA')
    for x in Lista:
        data = "\t" + x["tuote"]
        data = "{:<15}".format(data)
        data = data + x["valmistaja"]
        print(data)

    print("\n\n")
    print("\tLista tulostettiin onnistuneesti.")
    input("\tPaina jotain jatkaaksesi! ")





def HaetaanTuotteenValmistaja(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun tuotteen valmistaja (Enter=Exit).")
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "": break
        FoundLista=[]
        for x in Lista:
            if Tuote.lower() in x["tuote"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tTuotteella (" + Tuote + ") ei ole valmistajaa!" )
            input("\tPaina jotain jatkaaksesi! ")





def ListaaValmistajanTuotteet(Lista):
    while True:
        Found = False
        cls()
        print("\n\n")
        print("\tListataan halutun valmistajan tuotteet (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "": break
        FoundLista=[]
        for x in Lista:
            if Valmistaja.lower() in x["valmistaja"].lower():
                NewItem = {"tuote": x["tuote"], "valmistaja": x["valmistaja"]}
                FoundLista.append(NewItem)
                Found = True
        if Found:
            TulostaLista(FoundLista)
        else:
            print("\n\tValmistajalla (" + Valmistaja + ") ei ole tuotteita!" )
            input("\tPaina jotain jatkaaksesi! ")





def LisaaTuote(Lista):
    while True:
        cls()
        print("\n\n")
        print("\tLisätään uusi tuote listaan (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        Lista.append(NewItem)

#***

#Tallentaa kysytyt tiedot tiedostoon KARKIT.txt
FileName = open("KARKIT.txt", "w") #Avaa tiedosto kirjoittamista varten.

#Kirjoita ylla luetut tiedot tiedostoon riveittain.
FileName.write("tuote" + "\n")
FileName.write("valmistaja" + "\n")

FileName.close() #Sulje tiedosto.

FileName = open("KARKIT.txt", "r") #Avataan tiedosto lukemista varten.

while True:
    rivi = FileName.readline() #Luetaan tiedostosta rivi.
    if len(rivi) == 0:
        break
    print(rivi, end = "")

FileName.close() #Suljetaan tiedosto.

#***

def PoistaTuote(Lista):
    while True:
        cls()
        Found = False
        print("\n\n")
        print("\tPoistetaan nimetty tuote (Enter=Exit).")
        Valmistaja = str(input("\tAnna valmistajan nimi: "))
        if Valmistaja == "":
            return Lista
        Tuote = str(input("\tAnna tuotteen nimi: "))
        if Tuote == "":
            return Lista
        NewItem = {"tuote": Tuote, "valmistaja": Valmistaja}
        for x in range(len(Lista)):
            if Lista[x] == NewItem:
                Lista.pop(x)
                Found = True
                break
        if Found == False:
            print("\n\tValmistaa (" + Valmistaja + "), tai tuotetta (" + Tuote + ") ei ole!" )
            input("\tPaina jotain jatkaaksesi! ")





def menu():
    global Lista
    while True:
        cls()
        print ("\n\n\t")
        print ("\t1. Hae tuotteelle valmistajaa.")
        print ("\t2. Listaa valmistajan tuotteet.")
        print ("\t3. Lataa lista levyltä.")
        print ("\t4. Tallenna lista levylle.")
        print ("\t5. Tulosta tuotelista.")
        print ("\t6. Lisää tuote")
        print ("\t7. Poista tuote")
        print ("\t8. Lopetus")

        valinta = input('\n\tAnna valintasi [1-8] : ')
        if valinta      == "1": cls(); HaetaanTuotteenValmistaja(Lista)
        elif valinta == "2": cls(); ListaaValmistajanTuotteet(Lista)
        elif valinta == "3": cls(); Lista=LoadLista(FileName)
        elif valinta == "4": cls(); SaveLista(Lista,FileName)
        elif valinta == "5": cls(); TulostaLista(Lista)
        elif valinta == "6": cls(); Lista=LisaaTuote(Lista)
        elif valinta == "7": cls(); Lista=PoistaTuote(Lista)
        elif valinta == "8": break

menu()

Lisäsin koodia riveille 140 -161, mutta en osaa tätä! En osaa tehdä sitä tallentavaa versiota! :(
 
Kokeilin itse juuri tuota viestissä 36 olevaa versiota (ihan copypastesin sen omalle koneelle), poistin nuo rivit 140-161 ja homma toimii ihan täysin. Noissa sun lisäämissä riveissä vaikutti olevan kaikenlaista kummaa kun sisennykset olivat ihan metsässä sun muuta, siksi heitin ne ennen testausta pois.

Kun käynnistää ja painaa 5 niin näkyy lista oikein, 6 eli lisää tuote toimii, 4 eli tallenna tallentaa tiedostoon KARKIT.TXT. Numerolla 8 pois ohjelmasta. Uusi käynnistys ja 5:lla lista, listaa oletuksena olevat tuotteet, 3 eli lataa ja perään 5 niin näkyy edellisellä käynnistyksellä lisätyt tuotteet.

Eli minulla tuo ainakin toimii ihan täysin linuxilla ja python 3.6:lla testattuna.
 
Lisäsin koodia riveille 140 -161, mutta en osaa tätä! En osaa tehdä sitä tallentavaa versiota! :(
Joo, alku aina hankalaa ..., vai miten se meni.

Lisätäänpä tuo yksi if ... rivi siihen valikon alkuun, heti "Listan" globaaliksi julistamisen jälkeen, mutta poista ensin ne omat lisäykset kuten Hyrava tuossa edellä sanoikin. Tämä if ... rivin lisäys tarkistaa onko tiedosto olemassa, ja mikäli on, kutsuu jo olemassa olevaa latausfunktiota lataamaan listan levyltä. Kuten nyt huomaat, olemme jo kertaalleen tehneet tiedoston lataavan funktion, ja meidän ei sen vuoksi tarvitse muuta kuin kutsua sitä tarvittaessa.

Katsotaanpa, mikä verran tämä auttoi ideoimaan, automaattisen tallennustarpeen tarkistajan teossa, joka oli se toinen kehittelytehtävä. Meillä on kaksi erilaista tapaa todentaa "Listan" muuttuneen:
  1. - Lataamme listan levyltä vaikka Temp[ ] listaksi, ja vertaamme sitten näitä kahta listaa toisiinsa.
  2. - Asetamme globaalin muuttujan, jonka tilaa vaihdetaan niiden funktioiden toimesta, jotka ovat vastuussa "Listaan" tapahtuneista muutoksista (poisto, lisäys ja mahdollisesti jatkossa tapahtuva aakkostaminen).
Tämä viimeisin (2) tuhlaa vähiten muistia, ehkä se on parempi, ihan sama tässä tapauksessa kummalla tavalla teet, kunhan yrität jotain.

Python:
def menu():
    global Lista
    if os.path.isfile(FileName): Lista=LoadLista(FileName)



PALAUTETTA
Tarkastellaanpas vähän sitä mitä sait aikaan. Luvit tiedoston sisällön ja tulostit sen näytölle näin (poistin REM merkinnät, lyhentääkseni koodiasi).
Python:
FileName = open("KARKIT.txt", "r")
while True:
    rivi = FileName.readline()
    if len(rivi) == 0:
        break
    print(rivi, end = "")
FileName.close()
Ensinnäkin, tässä täytyy muistaa että "KARKIT.txt" on eri tiedosto kuin "KARKIT.TXT", toiseksi, tuo olisi voitu hoitaa lyhyemminkin:
Python:
with open("KARKIT.TXT", "r") as f: print(f.readlines())
Aivan, yksi rivi olisi riittänyt. Huomion arvoista tässä tavassa on se, ettei tiedostoa tarvitse sulkea, se sulkeutuu automaattisesti with open() -menetelmää käytettäessä, ja taas parannettiin lähdekoodin luettavuutta. Jos epäilet sulkeutuuko tiedosto automaattisesti voit testata sitä, lisäämällä tämän rivin: print(f.closed), joka palauttaa arvon True, jos tiedosto oli suljettu. Toinen huomion arvoinen seikka on f.readlines(), joka lukee tiedoston kaikki rivit kerralla ja mikäli haluat rajata luettavat tavut, teet sen näin f.readlines(200), jolloin luetaan vain 200 merkkiä. Tee itsellesi selväksi nämä kaksi tiedoston käsittely menetelmää writelines() ja readlines(), tulet varmasti tarvitsemaan niitä joskus.


EDITORI
Olen tässä miettinyt onko se Visual Studio Code ympäristö sopiva aloittelijalle, onhan sen ympäristön oppiminen ja hyödyntäminen kuitenkin aika vaativa tehtävä. Luulen että näin alkuvaiheessa, editorin tulisi olla yksinkertainen kuten Geany koodieditori on, ja vasta kun siirtyy vaativampaa tuottamaan jossa editorilta vaaditaan venymistä lähes mille koodaamiselle tahansa, katselee muita vaihtoehtoja.
esimerkki.png
 
Viimeksi muokattu:
Kokeilin itse juuri tuota viestissä 36 olevaa versiota (ihan copypastesin sen omalle koneelle), poistin nuo rivit 140-161 ja homma toimii ihan täysin. Noissa sun lisäämissä riveissä vaikutti olevan kaikenlaista kummaa kun sisennykset olivat ihan metsässä sun muuta, siksi heitin ne ennen testausta pois.

Kun käynnistää ja painaa 5 niin näkyy lista oikein, 6 eli lisää tuote toimii, 4 eli tallenna tallentaa tiedostoon KARKIT.TXT. Numerolla 8 pois ohjelmasta. Uusi käynnistys ja 5:lla lista, listaa oletuksena olevat tuotteet, 3 eli lataa ja perään 5 niin näkyy edellisellä käynnistyksellä lisätyt tuotteet.

Eli minulla tuo ainakin toimii ihan täysin linuxilla ja python 3.6:lla testattuna.

No sama juttu... TOIMII!!! ;) Olin sekoittanut omaa koodiani oikein kunnolla ja sitä jäi näemmä vielä tänne viimeksi lisäämäni koodin sekaan(KIN). Saan lisättyä ja poistettua!

Seuraavaksi lisään vielä vaikka viimeisen käyttöpäivän namuille. Nyt yritän olla sotkematta toimivaa koodia siinä sivussa!!! :p
 
Seuraavaks opettelet sit GITin käytön! Sinne voit laittaa toimivissa vaiheissa koodin talteen ja sitten jatkaa uuteen vaiheeseen ja tehä vaikka mitä muuta hienoa kun oppii käyttämään. Ja sisään siihen pääsee suht helposti, vaikkapa tässä vaikutti nopeella silmäyksellä olevan ihan hyvä alkeitten opetus.
 
No sama juttu... TOIMII!!! ;) Olin sekoittanut omaa koodiani oikein kunnolla ja sitä jäi näemmä vielä tänne viimeksi lisäämäni koodin sekaan(KIN). Saan lisättyä ja poistettua!

Minä kerkisin jo miettiä SQLite versiota, tallennus ongelmien ratkaisuksi, mutta jätetään se tuonnemmaksi näin ollessa.
 
Seuraavaks opettelet sit GITin käytön!

Luulen että jokainen, joka jaksaa näiden ohjelmointi ympäristöjen kanssa telekuta, vuodesta toiseen, käy jossakin vaiheessa tekemässä tilin GitHub:lle tai jonnekin muualle vastaavaan, siitäkin huolimatta ettei mitään jaettavaa syntysikään, mutta uskon kuitenkin että PasteBin keveytensä vuoksi tulee tutuksi ensin.

Näiden GIT-jakojen kanssa joutuu olemaan aika niukkaan palautteeseen tyytyväinen, koska siellä ei saa mitään käsitystä siitä, onko asetettu jako kiinnostanut ketään, kun taas pastebin jaon laitettua, vierailuja seuraava laskuri pyörii hyvinkin villisti, ja vielä villimmin kun nimeää jakonsa englanninkielisillä nimillä. Asia tietysti muuttuu jos onnistut luomaan jonkun merkittävän tekeleen, josta kiinnostutaan laajemmin, mutta mistäpä niitä pöytälaatikko koodari pystyy loihtimaan, kaikki on jo tehty useampaan kertaan.
 
Viimeksi muokattu:

Statistiikka

Viestiketjuista
261 820
Viestejä
4 548 289
Jäsenet
74 850
Uusin jäsen
Max-fix

Hinta.fi

Back
Ylös Bottom