Muistikirja

  • Keskustelun aloittaja Keskustelun aloittaja Noona
  • Aloitettu Aloitettu
Liittynyt
07.07.2021
Viestejä
6
Tarkoituksena on luoda muistikirja-ohjelma pythonilla, jossa muistikirjaa voi lukea, lisätä merkintöjä, tyhjentää tai vaihtaa tiedoston toiseen. Ohjelman on tarkoitus aluksi tarkistaa onko haluttu tiedosto olemassa, ja jos ei luodaan tiedosto. Ohjelman tulisi myös kertoa minkä nimistä muistiota käytetään milloinkin.

Tuloste kohdassa: "Käytetään muistiota:" (jossa siis pitäisi olla tiedoston nimi) tuloste näyttää tältä: " Käytetään muistiota: <_io.TextIOWrapper name='muistio.txt' mode='r' encoding='UTF-8'> "
Missä vika, ja miten korjata? :hmm:

Koodi kokonaisuudessaan näyttää tältä:
Python:
import time

while True:
    
    try:
        tiedosto = open("muistio.txt","r")
    except IOError:
        print("Oletusmuistioa ei löydy, luodaan tiedosto.")
        tiedosto = open("muistio.txt","w")
        tiedosto.write("")
        tiedosto.close
    else:
        print("Käytetään muistiota:",tiedosto)   
        print("(1) Lue muistikirjaa\n(2) Lisää merkintä\n(3) Tyhjennä muistikirja\n(4) Vaihda muistiota(5) Lopeta")

        valinta = int(input("Mitä haluat tehdä?: "))
    
        if valinta == 1 :
            tiedosto = open("muistio.txt","r")
            kirja = tiedosto.readline()
            print(kirja)
            tiedosto.close()

        elif valinta == 2 :
            tiedosto = open("muistio.txt","a")
            lisa = input("kirjoita uusi merkintä: ")
            aika = time.strftime("%X %x")
            tiedosto.write(lisa+":::"+aika+"\n")
            tiedosto.close()

        elif valinta == 3 :
            tiedosto = open("muistio.txt","w")
            tiedosto.close()
            print("Muistio tyhjennetty.")
        
        elif valinta == 4 :
            tiedosto = input("Anna tiedoston nimi: ")
            try:
                tiedosto = open(tiedosto,"r")
                tiedosto.close
            except IOError:
                print("Tiedostoa ei löydy, luodaan tiedosto.")

        elif valinta == 5 :
            print("Lopetetaan.")
            break
        else :
            print("Tuntematon valinta.")
 
Varsinaiset Python-ekspertit korjatkoon, mutta vaikuttaisi siltä, että tuo, mitä nää luet "tiedosto" nimiseen muuttujaan on jonkinlainen tiedosto-objekti ja jos koitat suoraan printata sitä, niin se palauttaa Pythonissa jotain tuollaista.

Tuolta näkyis löytyvän apuja:


Eli tarviit vaan tuon yhden importin lisää ja pystyt kysymään siis tiedostolta sen absoluuttisen polun tuon name-funktion avulla ja sen jälkeen polulta pelkän tiedostonimen os.path.basename -funktion avulla.

Voi olla jotain suoraviivaisempiakin temppuja, mutta näytti omaan silmään ihan kurantilta.
 
Olisiko fiksumpaa alunperinkin laittaa tiedoston nimi johonkin muuttujaan? Tällöin tiedoston nimi olisi koko ajan tiedossa ja nuo muistiotiedoston vaihdot sun muut saisi toimimaankin. Tällä hetkellähän vaikka muistiota vaihtaa niin oikeasti data kirjoitetaan aina oletusmuistioon.
 
Niin, krhm :D Tosiaanhan tuo on näköjään koodin kirjoittelijan hallussa täysin tuo tiedoston nimeäminen, niin tuon edellisen voi kyllä unohtaa ja laittaa tosiaan vaikka muuttujaan tiedoston nimen, käyttää samaa tiedostojen availussa ja luonnissa ja printtailee sitä, missä tarvii.

Olkoon tuommosta nice to know -osastoa, miten tiedosto-objektilta saa kysyttyä tiedostonimen, mutta eihän sitä tosiaan tarvii tuossa kontekstissa noin vaikeasti tehdä.
 
Hei,

Tässä kontekstissa voit tehdä esim näin:
print("Käytetään muistiota:",tiedosto.name)

Tällöin tulostuu:
Käytetään muistiota: muistio.txt
 
Hei,

Tässä kontekstissa voit tehdä esim näin:
print("Käytetään muistiota:",tiedosto.name)

Tällöin tulostuu:
Käytetään muistiota: muistio.txt
Näinhän se toimi, kiitos! :)
Mutta nyt en saa vaihdettua muistion nimeä toiseen :hmm:
 
Jotta tuo toimisi edes jossain määrin järkevästi, pitää nuo kaikki kinteät "muistio.txt" -viittaukset muuttaa muuttujiksi ja määrittää tuo oletusmuistion nimi ennen while-looppia.

Samoin valinnassa 4 käy jo tällä hetkellä huonosti kun määrität tiedosto -nimiseen muuttujaan uuden tiedostonimen ja käytät samaa muuttujaa tiedoston kahvana. Tarkoitan siis tätä: "tiedosto = open(tiedosto,"r")".

Myös muistion luku luultavasti bugaa jollain tavalla, näin ihan nopeasti vilkaisemalla. Taisi jotain muitakin bugeja olla mutta nyt ei jaksa päässä enempää koodia kääntää yhtäkkiä.

Onko tuo joku koulu/kurssitehtävä? Aavistuksen vaikuttaisi siltä kun monet asiat voisi tehdä monin verroin fiksumminkin ja vähän vaikuttaisi että tuossa vaan opetellaan alkeellista tiedostojen käpistelyä. Esimerkiksi ainakin osa noista tiedostojen käpistelyistä kannattaisi tehdä "with open(tiedosto, moodi) as file" -tyylillä.
 
Joo, tuo tiedostojen availu em. tyylillä kävi itelläkin mielessä, mutta en jaksanut itse tuohon eilen tarttua, kun muutenkin sivusilmällä vilkaisin ja jotain nopeasti kirjoitin futiksen tauolla.

Joka tapauksessa tuolla säästää aina pikkaisen koodirivejä, kun ei tarvii erikseen kutsua close() -metodia ja samalla varmistaa sen, ettei tiedostokahva pääse jäämään auki ja aiheuttamaan harmia.

Varmaan on kyse jostain alkupään koulu- tai kurssitehtävästä, mutta hyvä tuo edellinen on minusta tiedostaa niin varhain kuin mahdollista.
 
Kyseessä juurikin vasta aloitteleva ja ensimmäisen kurssin viimeisiä tehtäviä.
Näillä neuvoilla olen päässyt taas eteenpäin, mutta en vielä loppuun asti.
Nyt saan muistion vaihdettua, mutta vaihdosta seuraavan valinnan kohdalla ohjelma tulostaa taas aiemman muistion nimen (eli muistio.txt eikä uusimuistio.txt). Eikö uusimuistio siis jää muistiin? Ja miksi näin :hmm:
 
Paha sanoa yhtäkkiä mistä tuo johtuu, on useampikin mahdollisuus. Jos olet nyt vaihtanut noiden kaikkien kiinteiden muistio.txt -tekstien sijaan tuon toimimaan muuttujalla niin muuttujan alustus on mahdollisesti väärässä paikassa tai mahdollisesti joku asia ylikirjoittaa uudemman muistion nimen jossain kohti koodia (tarkista ainakin tuo alkuperäisen koodin valinta 4 tuohon liittyen, siinä tehdään yhtäkkiä uuden tiedoston nimestä tiedostokahva joka tuskin toimii oikein). Hankala arvuutella näkemättä nykyistä koodia.

Tosiaan tuossa on useampikin asia vähän hassusti mutta tuon selittää aika hyvin tuo että on kurssitehtävä eikä välttämättä fiksumpia tapoja tehdä asioita ole vielä opetettu. Itse tekisin aikalailla eri tavalla tuon, mutta voi olla että vuosien kokemus vaikuttaa vähän asiaan.
 
Yritin säilyttää mahdollisimman paljon alkuperäistä koodia. Alkuperäinen ei lukenut tiedostosta kuin ensimmäisen rivin, en tehnyt siihen muutoksia tässäkään.
Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  muistio.py
#

import time

FileName="muistio.txt"

def UusiTiedosto(FileName):
    f = open(FileName,"w")
    f.write("")
    f.close
   
try:
    f = open(FileName,"r")
except IOError:
    print("Oletusmuistioa ei löydy, luodaan tiedosto.")
    UusiTiedosto(FileName)


while True:
   
        print("Käytetään muistiota:", FileName)  
        print("(1) Lue muistikirjaa\n(2) Lisää merkintä\n(3) Tyhjennä muistikirja\n(4) Vaihda muistiota(5) Lopeta")

        valinta = input("Mitä haluat tehdä?: ")
   
        if valinta == "1" :
            f = open(FileName,"r")
            kirja = f.readline()
            print(kirja)
            f.close()

        elif valinta == "2" :
            f = open(FileName,"a")
            lisa = input("kirjoita uusi merkintä: ")
            aika = time.strftime("%X %x")
            f.write(lisa+":::"+aika+"\n")
            f.close()

        elif valinta == "3" :
            f = open(FileName,"w")
            f.close()
            print("Muistio tyhjennetty.")
       
        elif valinta == "4" :
            FileName = input("Anna tiedoston nimi: ")
            try:
                f = open(FileName,"r")
                f.close
            except IOError:
                print("Tiedostoa ei löydy, luodaan tiedosto.")
                UusiTiedosto(FileName)

        elif valinta == "5" :
            print("Lopetetaan.")
            break
        else :
            print("Tuntematon valinta.\n")
 

Uusimmat viestit

Statistiikka

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

Hinta.fi

Back
Ylös Bottom