Start | open
 

open(fil)



Open öppnar en fil på datorn för läsning eller skrivning.

Läsning eller skrivning

Du anger när du öppnar filen om du vill läsa, skriva eller lägga till data på slutet på en redan befinlig fil. Om du inte anger något, så öppnar du filen för läsning.

öppna och läs textfil


f = open('/ex/text.txt') for rad in f: print(rad,end="") f.close()
Det är viktigt komma ihåg att stänga öppna filer i koden, när du inte använder dem längre.

with


Vill du slippa close() så kan du använda with, som har den inbyggda finessen att den stänger filen åt dig när ditt with -statement är slut.
with open('/ex/text.txt') as textfilen: print(textfilen.read())

skapa dict av textfil


Om vi har en datafil på disken på json -format, så är det förstås jättebra då det mycket enkelt går att läsa rakt in i en dictionary likt ovan exempel. Men det är inte alltid vi har det. Men det gör inget. Med lite kod kan vi tolka vilken fil som helst och göra om till dictionary. Vanligt är t.ex. att filer innehåller data som, förutom att poster är skilda med radbrytning, också har data skilda med antingen semikolon eller kommatecken. T.ex. data exporterad från äldre kontorsprogram som t.ex. kalkylprogram (excel m.fl.) blir vanligtvis separerad av semikolon. Nedan har vi en lång lista länder och deras koder åtskilda med kommatecken.
f = open('/csv/allcontries.csv', encoding="latin-1") lines = [x.rstrip() for x in f.readlines()] lander ={} for line in lines: (i,land) = line.split(',') lander[i]=land #print(lines) print(lander["AF"]) print(lander["SE"]) print(lander["DK"]) f.close()

molekylvikt, tentauppift (ish)


Antag vi har en textfil med atomer och deras massa, på varje rad en atom och massa åtskilld av mellanslag, exempel på fil: /ex/atom_massa.txt (öppnas i nytt fönster). Vi ska nu skriva en funktion som givet en molekyl t.ex. CH4, beräknar dess massa. Vi kan utnyttja att multiplikatorn alltid kommer efter atomen och vi kan anta att multiplikatorn bara är en (1st) siffra 2-9. OBS uppgiften förutsätter att även atomen enbart har en (1 st) bokstav (för en mer avancerad variant som kommer runt detta, se nästa uppgift).

Vi börjar med att läsa in filen och skapar en dictionary så att vi snabbt kan slå upp molekylvikten givet en atom.

För att beräkna en viss molekyls vikt loopar vi över strängen. Om tecknet är en bokstav, då är det en atom, dvs vi kollar upp vikten och lägger vikten i en lista. Om tecknet i strängen är en siffra, så multiplicerar vi senast ditlagda vikt i vår lista med denna multipel. Slutligen summerar vi alla vikter i vår lista och returnerar svaret.
vikt={} with open('/ex/atom_massa.txt') as fil: for rad in fil: atom,massa = rad.split() vikt[atom]=massa def mass(molekyl): molekylvikt=[] for m in molekyl: if(m.isnumeric()): molekylvikt[-1] = molekylvikt[-1] * float(m) else: molekylvikt.append(float(vikt[m])) return(sum(molekylvikt)) print("H2O",mass("H2O"),"g/mol") print("CH4",mass("CH4"),"g/mol") print("H2SO3",mass("H2SO3"),"g/mol")

molekylvikt, mer avancerad lösning


Om även 2-bokstavs atomer samt flersiffriga multipler ska tillåtas (typ alla molekyler), så kan vi splitta molekylen med reguljära uttryck, i detta fall findall(). Tricket vi kör, det är att först gör om molekyl-strängen till en lista, så t.ex. "AlCl3" blir ['Al','C','3'] eller "C5H12O" blir ['C','H','12,'O']. Detta gör vi med reguljära uttryck. På så vis kan vi hantera alla atomer och även stora multipler.
import re vikt={} with open('/ex/atom_massa.txt') as fil: for rad in fil: atom,massa = rad.split() vikt[atom]=massa def mass(molekyl): atomer = re.findall(r'([A-Z][a-z]+|[A-Z]|[0-9]+|\))', molekyl) molekylvikt=[] for m in atomer: if(m.isnumeric()): molekylvikt[-1] = molekylvikt[-1] * float(m) else: molekylvikt.append(float(vikt[m])) return(round(sum(molekylvikt),2)) print("H2O, Vatten",mass("H2O"),"g/mol") print("CH4, Metan",mass("CH4"),"g/mol") print("H2SO3, Svavelsyrlighet",mass("H2SO3"),"g/mol") print("C6H14, Hexan",mass("C6H14"),"g/mol") print("C5H12O, 1-Pentanol",mass("C5H12O"),"g/mol") print("HCl, Saltsyra",mass("HCl"),"g/mol") print("NaCl, Natriumclorid",mass("NaCl"),"g/mol") print("AlCl3, Aluminiumklorid",mass("AlCl3"),"g/mol")
En lösning utan reguljära uttryck kan se ut såhär. Vi splittar molekylen genom att hitta bokstäverna och siffrorna i strängen, och se till att vi får med alla siffror och bokstäver i en lista som vi sedan returnerar.
vikt={} with open('/ex/atom_massa.txt') as fil: for rad in fil: atom,massa = rad.split() vikt[atom]=massa def splitmolekyl(str): lista = [] i = 0 while(i < len(str)): if(str[i].isnumeric()): j = i+1 while(j < len(str) and str[j].isnumeric()): j +=1 lista.append(str[i:j]) i = j-1 elif(str[i].isupper()): j = i+1 while(j < len(str) and str[j].islower()): j +=1 lista.append(str[i:j]) i = j-1 i += 1 return(lista) def mass(molekyl): atomer = splitmolekyl(molekyl) molekylvikt=[] for m in atomer: if(m.isnumeric()): molekylvikt[-1] = molekylvikt[-1] * float(m) else: molekylvikt.append(float(vikt[m])) return(round(sum(molekylvikt),2)) print("H2O, Vatten",mass("H2O"),"g/mol") print("CH4, Metan",mass("CH4"),"g/mol") print("H2SO3, Svavelsyrlighet",mass("H2SO3"),"g/mol") print("C6H14, Hexan",mass("C6H14"),"g/mol") print("C5H12O, 1-Pentanol",mass("C5H12O"),"g/mol") print("HCl, Saltsyra",mass("HCl"),"g/mol") print("NaCl, Natriumclorid",mass("NaCl"),"g/mol") print("AlCl3, Aluminiumklorid",mass("AlCl3"),"g/mol")

fil med börsdata


Läser in en fil med stockholmsbörsens börsdata och ritar en graf. Perioden 2010 till nov 2024.
from browser import document as doc canvas = doc["canvaz17"] canvas.width = 250 canvas.height = 250 ctx = canvas.getContext('2d') ctx.strokeStyle = 'rgba(0,100,200, 1)' ctx.clearRect(0, 0, canvas.width, canvas.height) with open('/ex/stockholmsborsen.csv') as csvfil: borslst = csvfil.read().split('\n') ctx.lineWidth = 2 ctx.beginPath() ctx.moveTo(0, 0) ctx.lineTo(0, 250) ctx.moveTo(250, 250) ctx.lineTo(0,250) x = 10 min = 9999 max = 0 data = [] radnummer = 0 for rad in borslst: if(radnummer%15==0): cell = rad.split(";") num = float(cell[3].replace(" ","").replace(",",".")) if(num < min): min=num if(num > max): max=num data.append(num) radnummer+=1 for d in data: ctx.lineTo(x,(d-min)*250/(max-min)) x+=1 ctx.stroke()
15.022993087769 ms