Detta skapar en PDF som du sedan kan skriva ut. Du kan även spara ner PDFn och skriva ut senare.
Titel på utskriften?
Tack för ditt bidrag
Om vi kan använda det så lägger vi upp det på sidan. Nedan en länk till ditt bidrag om du vill spara det.
Spara som ...
Du sparar ditt skript under detta namn och kan sedan hämta tillbaka det med samma namn.
Läs in
Läs in ett tidigare sparat skript. Obs att du enbart kan läsa in skript i den webbläsare där du sparade skriptet. Vill du kunna läsa in och spara skript oberoende av webbläsare, så behöver du skaffa ett login (enkelt och gratis).
Skicka in bidrag
Föreslå rubrik
Beskriv vad din kod gör
Skapa kort länk
Använd en kort URL för att skicka länk till koden via SMS eller epost. När mottagaren klickar på länken, så öppnas denna webbsida, med din kod och din text. Länken rensas bort automatiskt om den inte används.
Rubrik (frivilligt)
Beskrivning (frivilligt)
Länk (kopiera hela)
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()
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())
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()
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")
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")
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")
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()
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()