Hjelp til Python

Kjøring av pythonprogrammer

Python startes fra terminalen med kommandoen:

 python3

For å avslutte Python:

 exit() eller CTRL-D

For å kjøre et Python-program rett fra terminalen:

 python3 filnavn.py

For å redigere filen skriver man:

 vi filename.py

For å gjøre endringer trykker man på i (som står for insert). Etter at en har gjort de nødvendige endringer trykker man på Esc og så taster inn

  :wq //for å gå ut og lagre
  :q! //for å gå ut uten å lagre

Hvis man velger å kjøre scriptet i terminalen og scriptet skal produsere plots, er måten å gjøre det på å skrive

  plt.savefig('filename.png')

Lange beregninger

Hvis man har program som tar lang tid å kjøre kan man bruke Markov (se mer i menyen til venstre under 'Markov'). Hvis man ønsker å lagre plot fra scriptet som kjører i tmux må man skrive en ekstra linje med kode før man importerer pyplot men etter å ha importert matplotlib.

     matplotlib.use('Agg')
     

Man kan lese mer om dette her.

Filbehandling

Informasjonen er i bunn og grunn remser av heltall, som i seg selv kan representere så mangt. Vi trenger et tegnsett (eng: encoding) for å angi hvordan informasjonen skal tolkes, og det er viktig at tekstdataen leses med samme tegnsett som det ble skrevet med. For å sikre at programmet vårt kommuniserer på riktig vis bruker programmeringsspråkene såkalte fil-strømmer/fil-håndtak. (eng: file stream / file handle). Stdin, stdout og stderr er eksempler på disse:

  • Stdin brukes når vi ønsker å gi input til programmet fra tastaturet.
  • Stdout brukes når vi ønsker å skrive fra programmet til skjerm.
  • Stderr brukes når vi ønsker å skrive feilmeldinger fra programmet.

Stderr og stdout skriver gjerne begge til terminalen, men ved å ha to separate strømmer har vi større handlefrihet i å skille mellom feilmeldinger og vanlig output.

Disse overføringskanalene skriver til faste mottakere hver gang, og er gjerne automatisk åpne ettersom det å skrive til/fra skjerm er noe man gjør forholdsvis ofte. I python kan de også fås tilgang til gjennom sys-modulen. I python3 vil input() automatisk ta imot data fra sys.stdin, mens print som default skriver til sys.stdout. Her kunne vi imidlertid godt ha oppgitt en alternativ strøm ved f.eks.

 print(*objects, file=sys.stderr).

Hvis man ønsker å kommunisere med noe annet enn de faste strømmene, som f.eks. en fil, så må denne overføringskanalen åpnes manuelt. I python3 gjøres dette typisk ved

 f=open('filename','w')

Her returnerer open() et filhåndtak som vi tilegner f. 'w' angir modusen vi ønsker å håndtere filen under. I dette tilfellet vil vi skrive til filen med plassering angitt av 'filename'. Dette er en relativ eller absolutt filsti. Hvis vi bare skriver filnavnet tolker python det som at filen ligger i samme mappe som programmet. Om vi gir hele stien leter python relativt det aktuelle hjemmeområdet.

På Windows skrives filstier med \ som seperator, mens Unixsystemer bruker /. Hvis du ønsker at programmet ditt skal virke på begge typer systemer kan du bruke os.path.join()for å bruke systemspesifikk seperator:

 import os
 >>> os.path.join('usr', 'bin', 'spam')
 'usr/bin/spam'

Hvis filen ikke eksisterer fra før vil den lages under kallet til open(), og hvert kall med 'w' vil overskrive tidligere informasjon. Hvis vi heller ønsker å tilføye informasjon under hvert funksjonskall bruker vi 'a' i stedet. Om vi ikke spesifiserer modusen tolker open() det som at vi ønsker lese-modus 'r'. Til slutt kan vi åpne for både lesing og skriving med 'r+'.

open() antar i utgangspunktet at vi jobber med tekstfiler. Om vi arbeider med binærfiler må vi oppgi dette ved å legge til en 'b' i modusen som brukes.

Når vi er ferdig med å behandle filen er det god praksis å kalle f.close() for å frigi allokerte ressurser. Allokering/deallokering kan imidlertid automatiseres ved å utnytte at klassen til filhåndtaket definerer context-manager-protokollen. Dette betyr simpelten at f har tilgjengelig metodene f.enter() og f.exit(), som kalles ved henholdsvis inngang og utgang av en with-kodeblokk.

 with open('filename', 'w') as f:
   pass
 f.closed()

I det aktuelle tilfellet vil f.closed() returnere true, ettersom with-kallet sørger for automatisk allokering/deallokering.

Nyttige metoder for arbeid med tekstfiler:

  • Lese fra fil:
    • f.read(size):
      • Leser size karakterer og returnerer en tekststreng. Hvis size ikke spesifiseres leses hele filen.
      • Hvis man har nådd enden av filen returnerer read() en tom streng ""
    • list(f) eller f.readlines():
      • Returnerer en liste av linjene i filen.
    • f.readline():
      • Leser en enkelt linje fra tekstfilen inklusive newline '\n'.
    • Man kan også iterere gjennom hver linje i en fil:
 for line in f:
    print(line, end='')
  • Skrive til fil:
    • f.write(string):
      • Skriver string til filen, og returner det skrevne antallet karakterer.
      • Objekter av andre typer enn string må konverteres før de kan skrives til en tekstfil, likedans må de konverteres til bytes-objekter før de kan skrives til en binærfil.
2025-01-20, Hallvard Norheim Bø