Python: Filer og unntak Gaddis: Kapittel 6

Like dokumenter
Python: Filer og unntak Gaddis: Kapittel 6

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Filer og unntak (exceptions) Utgave 3: Kap. 6. Terje Rydland - IDI/NTNU

Læringsmål og pensum. Inn- og utoperasjoner 21/10/16

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

Filbehandling Tekstfiler

TDT4110 Informasjonsteknologi grunnkurs: Python: Repetisjon. Professor Alf Inge Wang

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

Python: Valg og betingelser. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Repetisjon, del 2. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Læringsmål og pensum. if (be): else (not_to_be):

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Læringsmål og pensum. v=nkiu9yen5nc

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk. - 3rd edition: Kapittel 3. Professor Alf Inge Wang

Oppsummering fra sist

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 1 Introduksjon til Programmering og Python. Professor Alf Inge Wang

TDT4110 IT Grunnkurs Høst 2014

Øvingsforelesning 9 i Python (TDT4110)

TDT4110 Informasjonsteknologi grunnkurs: Tema: Lister og tupler. - 3rd edition: Kapittel 7. Professor Alf Inge Wang

Kapittel 1 En oversikt over C-språket

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Pensum: Starting out with Python

Del 1 En oversikt over C-programmering

Python: Strenger 3. utgave: Kapittel 8

TDT4110 Informasjonsteknologi grunnkurs: Programmering: En større case. Professor Alf Inge Wang

Læringsmål og pensum. En større case. Mål Lære å lage større og sammensatte programmer Pensum Kapitlene 1-9 og 12.

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Et større case. Terje Rydland - IDI/NTNU. Lære å lage større og sammensatte programmer

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Informasjon Prøveeksamen i IN1000 høsten 2018

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

Python: Oppslagslister (dictionaries) og mengder 3. utgave: Kapittel 9

Designe et program. TDT4110 Informasjonsteknologi grunnkurs: Kapittel 2 Python: Bruk av funksjoner, variabler og input/output. Mål.

TDT4110 IT Grunnkurs Høst 2015

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 2 Python: Bruk av funksjoner, variabler og input/output. Professor Alf Inge Wang

ITGK - H2010, Matlab. Repetisjon

TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og mengder (sets) - Kapittel 9. Professor Alf Inge Wang

Leksjon 7. Filer og unntak

Repetisjon, del 1. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

INF Notat om I/O i Java

IN Notat om I/O i Java

MENGDER (SETS) Læringsmål og pensum. Kapittel 9.2

Tirsdag 21/11. Onsdag 24/11. Tirsdag 12/12. TDT4110 Informasjonsteknologi grunnkurs: Tema: Et større case

Hvor gammel er du? Hvor gammel er du? Del 1: Skrive ut til skjerm. Gjøre selv. Skrevet av: Sindre O. Rasmussen, Kodeklubben Trondheim

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

TDT4105 Informasjonsteknologi, grunnkurs MatLab: Filbehandling - load, save, type - fopen, fgetl, feof, fprintf, fclose

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger. - 3rd edition: Kapittel 8. Professor Alf Inge Wang

TDT4110 Informasjonsteknologi grunnkurs: Eksempler. Mangekanter

YouTube-kanal ITGK. Læringsmål og pensum

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

TDT4105 Informasjonsteknologi, grunnkurs

Systemutvikling (Software Engineering) TDT 4110 IT Grunnkurs Professor Guttorm Sindre

IN1000 Repetisjonskurs: IO og listeoperasjoner (+ string)

Betinget eksekvering og logiske tester i shell

Øvingsforelesning 1 Python (TDT4110)

TDT4110 Informasjonsteknologi grunnkurs: Tema: Enkle funksjoner. - 3rd edition: Kapittel Professor Alf Inge Wang

TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker. - 3rd edition: Kapittel 4. Professor Alf Inge Wang

Oversikt. Beskrivelse Bash. 1 UNIX shell. 2 Kommandolinje som brukergrensesnitt. 3 Input og output. 4 Bash builtins. 5 Linux utilities.

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Dictionaries og sets (mengder) Utgave 3: Kap. 9. Terje Rydland - IDI/NTNU

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Læringsmål og pensum. Oversikt

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

Lage større programmer (Python, relatert til teoridelen om Software Engineering ) TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Programmeringsspråket C Del 2

TDT4110 Informasjonsteknologi grunnkurs: Tema: Funksjoner med retur og moduler. - 3rd edition: Kapittel Professor Alf Inge Wang

TDT4110 IT Grunnkurs Høst 2016

Læringsmål og pensum. Intro løkker. Mål Lære om begrepet løkker Lære om bruk av while-løkke Lære om bruk av for-løkke Pensum. Kapittel 4.

Øvingsforelesning 5 Python (TDT4110)

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Python: Variable og beregninger, innlesing fra tastatur utskrift til skjerm. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Forkurs i informatikk Python. Andreas Færøvig Olsen

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

Informasjon Eksamen i IN1000 høsten 2017

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre,

TDT4110 IT Grunnkurs Høst 2016

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

Øvingsforelesning i Python (TDT4110)

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Løse reelle problemer

EKSAMEN. Operativsystemer. 1. Læreboken "A Practical Guide to Red Hat Linux" av Mark Sobell 2. Maks. tre A-4 ark med selvskrevne notater.

Øvingsforelesning 5 Python (TDT4110)

INF Ekstrainnlevering

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

Oppsummering Assemblerkode Hopp Multiplikasjon Kode og data Array Oppsummering

Transkript:

Python: Filer og unntak Gaddis: Kapittel 6 TDT4110 IT Grunnkurs Professor Guttorm Sindre

Læringsmål og pensum Mål Lære hva filer er Lære hva unntaksbehandling er Kunne bruke inn- og utoperasjoner i Python Kunne programmere lesing og skriving til fil Kunne bruke unntak (exceptions) Pensum Starting out with Python, Files and Exceptions 2

Inn- og utoperasjoner HVORFOR trenger vi dette? Hittil lest inn data fra tastatur og skrevet ut til skjerm, input(), print() ok for små eksempler, ubrukelig for store datamengder hatt data i enkeltvariable, lister etc. Ok for prosessering underveis i programutførelsen Men data i primærminne glemmes når programmet avsluttes, maskinen slås av, eller lignende Typisk situasjon i den virkelige verden Store datamengder må kunne lagres permanent Data kommer fra nettet, sensorer, etc, Skal ikke tastes inn manuelt men prosesseres helautomatisk Trenger da input/output (I/O) med filer dere har brukt filer allerede (.py,.pdf, ) 3

Hva er ei fil i Python? Representert som en verdi av typen file Denne verdien / variabelen er ikke fila, bare en referanse Hvorfor bruke referanser til filene? Ei fil kan inneholde mye data, > minnekapasitet Referansen krever mye mindre plass ~ adressa til en bygning tar mye mindre plass enn selve bygningen Via referansen kan vi Navigere gjennom ei fil Finne data vi søker etter Putte deler av fila (eller hele hvis plass) inn i variable 4

Hva er ei fil i Python? (2) I ei fil lagres data etter hverandre (sekvensielt) Kan sammenlignes med en tekststreng Men tegnene ligger i sekundærminne (disk, minnepinne, ) Fila er muterbar (kan endre innhold) Filpeker holder orden på hvor langt man har kommet i fila. kan flyttes ved kommandoer. Filpeker 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 D E T T E E R T E K S T L A G R E T I F I L 5

Filoperasjoner i Python Tre hovedsteg: 1. Fila åpnes Etablerer en referanse til fila Filreferansen blir lagret i en variabel Alle operasjoner på fila må gå via denne variabelen 2. Verdier leses fra og skrives til fila Lesing: Data lagret i fil leses inn og lagres i variable Skriving: Data lagret i variable skrives til fila 3. Fila lukkes Etter at fila er lukket, kan man ikke lese eller skrive til fila Poeng (bl.a.): Frigjøre fila så andre kan bruke den Sørge for at filbruken avsluttes på en trygg måte 6

Filhåndtering i Python Filkommandoer f = open( filnavn ) Forklaring Åpner ei fil, returnerer filreferanse f = open( filnavn, tilgang ) Åpner ei fil, med spesifisert tilgang. F.eks. w åper ei fil for skriving (se neste side) f.read() f.read(n) f.readline() f.readlines() f.write(s) f.writelines(liste) f.seek(offset,fra_hvor) f.tell() f.close() Returnerer hele innholdet av fila Returnerer n karakterer av innholdet Returnerer neste linje (før \n) Returnerer hele innholdet av fila som ei liste Skriver strengen s til fil Skriver innholdet av liste av strenger til fil Forflytter filpekeren (index) i fila Returnerer posisjon til filpekeren i fila Lukker fila f representerer variabelen som tar vare på filpekeren 7

Åpning av filer For å bruke ei fil må den først åpnes ved open: variabel = open( filnavn, tilgangstype ) Forklaring: variabel: Får en referanse som peker til fila med angitt filnavn filnavn: Angir et stinavn og filnavn til fila som skal åpnes Hvis fila er på samme katalog som programmet trengs ingen sti tilgangstype: kode for typen filoverføring som skal gjøres Eks: f = open( datafil.txt, r ) # Åpner fil for lesing f = open( datafil.txt, w ) # Åpner fil for skriving f = open(r C:\Users\GS\textfiles\fil2.txt, a ) # med sti, legge til # r først inni parentesen for å unngå at \ tolkes som spesielle tegn 8

Tilgangstyper for open Vi har følgende tilgangstyper for open: Type Åpner for Tidl. innh. Hvis fila ikke fins? r Lesing. Bevares FEIL w Skriving Fjernes Oppretter ny fil a Skriving (bakerst) Bevares Oppretter ny fil r+ Lesing og skriving Bevares FEIL w+ Lesing og skriving Fjernes Oppretter ny fil a+ Lesing og skriving (bakerst) Bevares Oppretter ny fil 9

Lukking av filer Hvis flere programmer endrer på ei fil samtidig Kan lett bli tull Operativsystemet vil derfor nekte dette Etter at programmet er ferdig med å bruke fila: Lukk fila for å si ifra at den kan brukes av andre I noen tilfeller vil skrevne data heller ikke havne på fila hvis man glemmer å lukke den til slutt filvariabel.close() # Lukker fila 10

Skrive til fil For å skrive data til fil i Python brukes følgende: f.write(s) # Skriver strengen s til fil med referanse f f.writelines(liste) # Skriver en liste av strenger til fila Vi ser på et program som lar brukeren Angi et filnavn (og åpne fila for skriving) Gi inn tekst fra tastatur linje for linje (tom linje for å slutte) og tekstene lagres på fila To varianter: med write() filtest1, med writelines() filtest2 filtest1.py filtest2.py 11

Viktig å merke seg! write(), writelines() avslutter ikke default med linjeskift I motsetning til print() For å skrive linjeskift i fila må vi eksplisitt legge til \n Kun tekststrenger kan skrives til filer Andre typer data (f.eks. tall) må konverteres til strenger Kan bruke str(variabel) Tilsvarende ved lesing av filer: Må eksplisitt strippe \n fra data lest fra fil hvis vi ikke vil ha den Hvis vi skal få tall, må vi konvertere fra strenger til tall F.eks int( ), float( ) 12

Lese strenger fra fil For å lese strenger fra fil, benyttes: streng = filvariabel.read() # returnerer hele innholdet streng = filvariabel.readline() #eller n tegn hvis parameter angis read(n) # returnerer ei linje streng = filvariabel.readlines() # returnerer ei liste av linjene read() og readlines() bør unngås for store filer. readline() og readlines() krever fil delt med linjeskift (\n). readline() : bruke while-løkke for å sjekke om fila er slutt readlines() : lese hele i en setning, uten løkke Vi ser på hvordan de virker i interaktiv modus 13

for-løkke, lese linje for linje Leser ei linje av fila per runde av løkka Slutter ved enden av fila Format: for line in file_object: kode Minner om tilsvarende type for-løkker for lister 14

Oppgave: Lese og skrive fil LETTERE: Start med fila prog.txt og koden ps_lett_v0.py. (a) Lag funksjonen les_fil( ) for å lese fra fila og inn i ei liste som returneres fra funksjonen (b) Lag funksjonen skriv_fil( ) som skriver ei liste til fil MIDDELS: Start med fila prog2.txt og koden ps_mid_v0.py (a) Lag funksjonen les_fil( ) (b) Lag funksjonen skriv_fil( ) VANSKELIG: Se på gamle_valutakurser.txt som er hentet fra Norges Bank sine websider Les denne fila inn i ei 2D-liste hvor tekst lagres som strenger, heltall som int og desimaltall som float. NB: Merk at første linje av fila har andre slags data enn resten, og at det står ND (No Data) en del steder hvor det normalt ville ha stått tall. Merk også at fila har komma i desimaltall (norsk standard) mens Python trenger punktum for float 15

Unntak ( Exceptions ) Kapittel 6.4

Exception / Unntak Under kjøring av program kan det oppstå feil Programmet stopper, feilmelding i rødt F.eks. divisjon på 0, feil indeks til liste, int() på en streng med annet enn tall, Unntak kan brukes generelt i Python, ikke bare for filer Men særlig vanlig for filer, pga mange mulige feil: Forsøk på å åpne fil som ikke fins Fila er i bruk av andre, kan ikke åpnes Lagringsmediet er korrupt, kan ikke leses Data på fil har annet format enn forventet try/except kan unngå at programmet stopper opp Håndtere feilen på en mer elegant måte. 17

Exception: try except uttrykk Usikker kode skrives inne i et try: uttrykk Hvis alt går som det skal, er det koden inni try som kjøres Alternativ kode ved eventuelle feil: except ExceptionName: try: uttrykk uttrykk except ExceptionName: uttrykk uttrykk # En feil i try-blokka trigger except # Hopper hit hvis feil i try # (såframt type unntak stemmer) Hvis navn på unntaket droppes, tar den alle unntak Minner om et if-else-uttrykk (hvis ok så ellers ) 18

Enkelt eksempel UTEN filer int() vil feile for annen input enn tall. To løsninger: Bruke if-setninger, sikre at vi alltid har tall til int() Bruke unntak, la int() feile men takle feilen print( Alle data skal gis som heltall. ) alder = int(input( Oppgi alder: )) vekt = int(input( Oppgi høyde i cm: )) h = int(input( Høyde i cm: )) epler = int(input( Hvor mange epler har du? )) print( Alle data skal gis som heltall. ) alder = input( Oppgi alder: ) if alder.isdigit(): alder = int(alder) else: print( Feil format på inndata ) vekt = input( Oppgi høyde i cm: ) if vekt.isdigit(): vekt = int(vekt) else: print( Feil format på inndata ) # Kode ikke komplett, forts. med h og epler print( Alle data skal gis som heltall. ) try: alder = int(input( Oppgi alder: )) vekt = int(input( Oppgi høyde i cm: )) h = int(input( Høyde i cm: )) epler = int(input( Hvor mange epler har du? )) except ValueError: print( Feil format på inndata ) 19

Exception ExceptionName Ulike typer Exceptions har ulike navn, f.eks. ValueError: feil data for funksjon, f.eks. int( ost ) TypeError feil type data for operasjon, f.eks 2+ ost ZeroDivisionError: prøver å dividere med 0 IndexError: feil indeks, f.eks a=[8,3,2], x=a[4] OSError Feil ved bruk av OS-funksjoner, f.eks filer IOError er f.o.m. Python v 3.3 bare en alias for denne Flere undertyper: FileNotFoundError, FileExistsError, Exception: Alle mulige feil (generell) Dette er også hva man får hvis man bare skriver except: 20

Hva bør try-blokka dekke? Koden som kan gå galt PLUSS: kode som det ikke gir mening å kjøre hvis forutgående kode gikk galt Vi ser videre på middels-oppgaven fra i sted Sette try-blokk bare i funksjonen les_fil()? Ikke så god ide, for hvis det feiler blir variabelen tabell i main() uten innhold Virker derfor lurere å sette try-blokka i main() KODE: ps_mid_v2.py ps_mid_v3.py 21

Exception vis feilmelding Det er mulig å vise feilmeldingen som Python gir: try: uttrykk except Exception as variabel: print(variabel) Uttrykket as variabel lagrer feilmeldingen i variabelen ps_mid_v4.py 22

Exception else og finally Et try except uttrykk kan også bestå av else og finally: else blir utført hvis ingen exceptions ble trigget. finally blir utført til slutt, uansett om exceptions ble trigget eller ikke try: uttrykk except ExceptionName: uttrykk else: uttrykk finally: uttrykk ps_mid_v5.py

Filhåndteringsprosess Tre hovedsteg: 1. Åpne fil med en gitt aksess 2. Lese fra /skrive til fila, evt. forflytte filpeker 3. Lukke fila Vi kan jobbe med flere filer samtidig: Filvariabelen med referanse til fila bestemmer hvilken fil vi jobber med. Kan f.eks. la bruker skrive inn filnavn fra tastaturet Velge mellom alternative filer for lesing Eller alternative filer å skrive til 24

Exceptions / Unntak Exception: feil som skjer når et program kjører Som regel fører det fører det til at programmet stopper (kræsjer, feilmelding) Exception handling: Håndtere exceptions ved å kjøre alternativ kode heller enn å kræsje Benytter: try: # Prøv om koden lar seg kjøre except # Fanger opp hvis koden i try feiler except Exception as variable: # fanger feilmelding else: # Kjøres hvis det ikke blir exception finally: # Kjøres uansett til slutt 25