def generer_python_fra_csv(inputfil, outputfil): """ Leser en csv-fil og genererer en py-fil """ brukerkode = lagre_brukerdata(outputfil) csv_fil = open(inputfil, mode = 'r', encoding='utf-8') py_fil = open(outputfil, mode = 'w+', encoding='utf-8') bliblioteker = csv_fil.readline().split(';')[1:] skriv_biblioteker_til_fil(bliblioteker, py_fil) # Den første linja er allerede lest, og vil ikke bli lest på nytt her. for linje in csv_fil: skriv_metode_til_fil(linje.split(';'), py_fil) csv_fil.close() py_fil.write("## skriv brukerkode her:\n") py_fil.write(brukerkode) py_fil.close() def skriv_biblioteker_til_fil(biblioteker, py_fil): """ Går gjennom bibliotekene og skriver import utrykk til py-filen. """ for bibliotek in biblioteker: if bibliotek.strip(): py_fil.write(f"import {bibliotek}\n") def formater_docstreng(docstreng): """ Sørger for at en docstreng aldri inneholder mer en 80-tegn per linje. """ ord = docstreng.split(' ') makslengde = 80 lengde = 0 linjer = [] linje = "" for o in ord: ordlengde = len(o) if lengde + ordlengde > makslengde: linjer.append(linje) linje = f"{o} " lengde = ordlengde else: linje += f"{o} " lengde += ordlengde + 1 linjer.append(linje) # Legger til den siste linja return ' """\n ' + '\n '.join(linjer) + '\n """' def skriv_metode_til_fil(metode, py_fil): """ Skriver en python-metode til py.filen. Metode er en liste på formen [metodenavn, beskrivelse, p1 .. pn, returverdi] """ # * "pakker ut" alle resterende verdier i lista, så dette gir oss navn, beskrivelse [parametre], returverdi. Dette fungerer og om det ikke er noen parametre. navn, beskrivelse, *parametre, returverdi = metode beskrivelse = formater_docstreng(beskrivelse) metode_til_fil = f"def {navn}({', '.join(parametre)}):\n{beskrivelse}\n return {returverdi}\n\n" py_fil.write(metode_til_fil) def lagre_brukerdata(filnavn): """ Leser en tidligere generert fil, og lagrer kode brukeren har lagt til på slutten av filen. """ from pathlib import Path # Pathlib er et bibliotek for å håndtere filstier. Her vil jeg sjekke om en fil eksisterer eller ikke. if not Path(filnavn).exists(): return "" fil = open(filnavn) brukerkode = "" for linje in fil: if linje.startswith("## skriv brukerkode her:"): # Leser de resterende linjene brukerkode = fil.read() fil.close() return brukerkode.rstrip() # rstrip fjerner eventuell linjeskift osv på slutten def hovedprogram(): filer = ['biblioteker.csv', 'test.csv', 'hemmelig.csv'] outputfiler = ['biblioteker.py', 'test.py', 'hemmelig.py'] for fil, programfil in zip(filer, outputfiler): generer_python_fra_csv(fil, programfil) hovedprogram()