^ Linux – Friheden til at programmere i Python: Version 1.0.20040516 – 2020-12-31 ^| | [[python:python-range|forrige]] | Kapitel 3. Biblioteks reference | [[python:python-tid|næste]] | ---- ==== 3.4. Læs og skriv filer ==== heleTeksten= open('filnavn.txt').read() # hent hele indholdet i en tekstfil alleData = open('fuldeFilsti', 'rb').read() # hent hele indholdet i en binær fil filObjekt = open('filnavn.txt') heleTeksten = filObjekt.read() filObjekt.close() listeAfAlleLinjer = filObjekt.readlinjes() listeAfAlleLinjer = filObjekt.read().splitlinjes(1) listeAfAlleLinjer = filObjekt.read().splitlinjes() listeAfAlleLinjer = filObjekt.read().split('\n') listeAfAlleLinjer = list(filObjekt) filObjekt = open('fuldeFilsti', 'rb') while 1: blok = filObjekt.read(100) if not blok: break anvend blokken (f.eks. til udskrift) filObjekt.close() for linje in open('filnavn.txt'): print linje filObjekt = open('filnavn.txt') while 1: linje = filObjekt.readlinje() if not linje: break print linje filObjekt.close() open('filnavn.txt', 'w').write(heleTeksten) # skriv tekst til en tekstfil open('fuldeFilsti', 'wb').write(alleData) # skriv binære data til en binær fil filObjekt = open('filnavn.txt', 'w') filObjekt.write(heleTeksten) filObjekt.close() filObjekt.writelines(listeAfAlleTekststrenge) open('fuldeFilsti', 'wb').writelines(listeAfAlleDataStrenge) === 3.4.1. Hent fil linje for linje === import linecache fuldeFilsti = "autoexec.bat" valgteLinjenummer = 0 linjen = linecache.getline(fuldeFilsti, valgteLinjenummer) # getline er fordefineret i Python def getline(fuldeFilsti, valgteLinjenummer): if valgteLinjenummer < 1: return '' aktuelleLinjeNummer = 0 for linje in open(fuldeFilsti): aktuelleLinjeNummer += 1 if aktuelleLinjeNummer == valgteLinjenummer: return linje return '' for linje in open(fuldeFilsti).xreadlines(): print linje === 3.4.2. Find antal linjer i tekstfil === import linecache fuldeFilsti = "autoexec.bat" antalLinjer = len(open(fuldeFilsti).readlines()) print antalLinjer === 3.4.3. Skriv til udfil === import sys try: udfil = open( "filnavn.txt", "w" ) except IOError, melding: print >> sys.stderr, "Fejlmelding:", melding sys.exit( 1 ) udtekst = "" tekst = " " while len(tekst) > 0: tekst = raw_input( "Skriv tekstlinje (tom lukker fil): " ) udtekst += tekst + "\n" print >> udfil, udtekst # skriv tekst til udfil udfil.close() print "Udfilen er lukket." Kørselsresultat: python udfilNy.py Skriv tekstlinje (tom lukker fil): Ny tekst i ny udfil." Skriv tekstlinje (tom lukker fil): Udfilen er lukket. Indhold i den nyoprettede filnavn.txt Ny fil i ny udfil === 3.4.4. Hent fil i Python (Linux) bibliotek === import sys try: indfil = open( "/usr/lib/python2.2/calendar.py", "r" ) except IOError: print >> sys.stderr, "Filen blev ikke hentet ind." sys.exit( 1 ) indtekst = indfil.read() print str(indtekst) indfil.close() print print "Filen er lukket." import sys try: udfil = open( "filnavn.txt", "wb" ) except IOError, melding: print >> sys.stderr, "Fejlmelding:", melding sys.exit( 1 ) udtekst = "" tekst = " " while len(tekst) > 0: tekst = raw_input( "Skriv tekstlinje (tom lukker fil): " ) udtekst += tekst + "\n" print >> udfil, str(udtekst ) # skriv tekst til udfil udfil.close() print "Udfilen er lukket." === 3.4.5. Gem liste i fil === import sys try: udfil = open( "filnavn.txt", "w" ) except IOError, melding: print >> sys.stderr, "Fejlmelding:", melding sys.exit( 1 ) liste = [1,2,3,4,5,6,7,8,9] print >> udfil, str(liste ) # skriv liste til udfil udfil.close() print "Udfilen er lukket." filnavn.txt kontrol viser indholdet: [1, 2, 3, 4, 5, 6, 7, 8, 9] === 3.4.6. Udvid fil (append) === import sys try: udfil = open( "filnavn.txt", "a" ) except IOError, melding: print >> sys.stderr, "Fejlmelding:", melding sys.exit( 1 ) udtekst = "" tekst = " " while len(tekst) > 0: tekst = raw_input( "Skriv tekstlinje (tom lukker fil): " ) udtekst += tekst + "\n" print >> udfil, str(udtekst ) # skriv tekst til udfil udfil.close() print "Udfilen er lukket." === 3.4.7. Læs fra fil === import sys try: udfil = open( "filnavn.txt", "w" ) except IOError, melding: print >> sys.stderr, "Fejlmelding:", melding sys.exit( 1 ) udtekst = "" tekst = " " while len(tekst) > 0: tekst = raw_input( "Skriv tekstlinje (tom lukker fil): " ) udtekst += tekst + "\n" print >> udfil, str(udtekst ) # skriv tekst til udfil udfil.close() print "Udfilen er lukket." BEMÆRK: str funktionen kræves a.h.t. dansk/norske specialtegn. Kørselsresultat: ajbo@linux:~> python indfil.py ['Microsoft får en ordentlig bredside i en ny rapport fra den amerikanske \n', 'organisation Computer & Communications Industry Association (CCIA). Manglen \n', 'på ordentlig sikkerhed i Microsofts programmer og det faktum, at Windows er \n', 'det mest udbredte styresystem i verden, betyder tilsammen, at verden generelt \n', 'er blevet mere sårbar overfor trusler mod sikkerheden, konkluderer rapporten.\n'] Filen er lukket. ajbo@linux:~> Teksten er uddrag fra en Netavisen Infopaq mail udsendt/modtaget 24. sept 03 === 3.4.8. Skriv bytes til udfil === import sys try: udfil = open( "filnavn.txt", "wb" ) except IOError, melding: print >> sys.stderr, "Fejlmelding:", melding sys.exit( 1 ) udtekst = "" tekst = " " while len(tekst) > 0: tekst = raw_input( "Skriv tekstlinje (tom lukker fil): " ) udtekst += tekst + "\n" print >> udfil, str(udtekst ) # skriv tekst til udfil udfil.close() print "Udfilen er lukket." Fra kørselsresultat: filnavn.txt indeholder: Nu går vi over til at udsende teksten i antal bytes. Flere bytes skrives til filen. === 3.4.9. Hent bytes fra fil === import sys try: indfil = open( "filnavn.txt", "rb" ) except IOError: print >> sys.stderr, "Filen blev ikke hentet ind." sys.exit( 1 ) indtekst = indfil.readlines() print str(indtekst) indfil.close() print print "Filen er lukket." Kørselsresultat: ajbo@linux:~> python indfilBytes.py ['Nu går vi over til at udsende teksten i antal bytes.\n', 'Flere bytes skrives til filen.\n', '\n', '\n'] Filen er lukket. ajbo@linux:~> === 3.4.10. Hent bytes fra fil eksempel 2 === Til dette eksempel har jeg benyttet command.com fra Microsoft Windows Me import sys try: indfil = open( "/windows/C/command.com", "rb" ) except IOError: print >> sys.stderr, "Filen blev ikke hentet ind." sys.exit( 1 ) indtekst = indfil.read() print str(indtekst) indfil.close() print print "Filen er lukket." Kørselsresultat (uddrag af den store udskrift): enhed Den terminalenhed, som du vil bruge, f.eks. COM1. 1Viser eller indstiller datoen. DATE [dato] Skriv DATE uden parametre for at f vist den aktuelle datoindstilling og for at kunne angive en ny. Tryk p ENTER for at beholde den nuvrende dato. aSletter en eller flere filer. === 3.4.11. Hent bytes fra fil eksempel 3 === I dette eksempel læses filen vinduer.jpg, der også benyttes et andet sted i bogen. import sys try: indfil = open( "vinduer.jpg", "rb" ) except IOError: print >> sys.stderr, "Filen blev ikke hentet ind." sys.exit( 1 ) indtekst = indfil.read() print str(indtekst) indfil.close() print print "Filen er lukket." Kørselsresultat (ganske kort uddrag af returgodset) python indfilBytes3.py ÿØÿàJFIFHHÿþLEAD Technologies Inc. V1.01ÿUC === 3.4.12. Søg og erstat tekst i fil === #!/usr/bin/env python import os, sys antalArgumenter = len(sys.argv) if not 3 <= antalArgumenter <= 5: print "Anvend: %s tekstAtFinde erstatningsTekst [indfil [udfil]]" % \ os.path.basename(sys.argv[0]) else: findeTekst = sys.argv[1] erstatteTekst = sys.argv[2] input = sys.stdin output = sys.stdout if antalArgumenter > 3: input = open(sys.argv[3]) if antalArgumenter > 4: output = open(sys.argv[4], 'w') for s in input.xreadlines(): output.write(s.replace(findeTekst, erstatteTekst)) output.close() input.close() Et kørselsresultat: python erstatTekst.py Anvend: erstatTekst.py tekstAtFinde erstatningsTekst [indfil [udfil]] Når filen søges afviklet uden de nødvendige parametre udskrives der som vist en anvisning på, hvordan kaldet skal foregå. sys.argv[0] er selve programmets navn (erstatTekst.py). I Python bøger er det normalt at angive valgfrie parametre i firkantede parenteser. Det er altså i herværende tilfælde ikke absolut nødvendigt at angive en indfils navn, det samme er tilfældet med en udfils navn. Udeladelse af de to navne er imidlertid upraktisk i det aktuelle tilfælde, så et kald kunne være:python erstatTekst.py "Microsoft" "Linux" "/windows/C/autoexec.bat" "autoexec.bat" Der er bare det ved det, at ordet "Microsoft" næppe forekommer i autoexec.bat filen. Resultatet vil altså alene blive at filen bliver kopieret fra Microsoft Windows biblioteket til rodbiblioteket i Linux, men det kan jo også være fint nok.import os, sys, string indfil = open( "/windows/C/autoexec.bat", "r" ) udfil = open( "autoexec.bat", "w" ) findeTekst = "WINDOWS"; erstatteTekst = "Linux" for s in indfil.readlines(): udfil.write(string.replace(s, findeTekst, erstatteTekst)) indfil.close udfil.close Før programafvikling: SET windir=C:\WINDOWS SET winbootdir=C:\WINDOWS SET COMSPEC=C:\WINDOWS\COMMAND.COM SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND SET PROMPT=$p$g SET TEMP=C:\WINDOWS\TEMP SET TMP=C:\WINDOWS\TEMP Efter programafvikling: SET windir=C:\Linux SET winbootdir=C:\Linux SET COMSPEC=C:\Linux\COMMAND.COM SET PATH=C:\Linux;C:\Linux\COMMAND SET PROMPT=$p$g SET TEMP=C:\Linux\TEMP SET TMP=C:\Linux\TEMP De to linjer: for s in indfil.readlines(): udfil.write(string.replace(s, findeTekst, erstatteTekst)) Kan også skrives: for s in indfil: udfil.write(s.replace(findeTekst, erstatteTekst)) Lad Python fortælle, hvad et modul indeholder: >>> sys returstrengen fortæller, at sys er et i Python indbygget (fordefineret) modul. sys inkluderes i dette eksempel ene og alene for at kunne lukke programmet ned, når der klikkes på knappen. Herved udføres kommandoen root.exit I interaktiv mode kan det undertiden være vanskeligt at få kørslen stoppet og komme ud af programmet. I Windows kan du komme ud ved at trykke på Ctrl og Z tasten samtidig. I Linux skulle du kunne komme ud ved at trykke samtidig på Ctrl og D. I SuSE 8.2 skal du imidlertid trykke Ctrl C for at komme ud. Men det korte og det lange er, at sys.exit og nævnte tastetryk har samme virkning. Vi kan også få at se, hvad modulet indeholder: >>> import sys >>> dir (sys) ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_getframe', 'argv', 'builtin_module_names', 'byteorder', 'copyright', 'displayhook', 'dllhandle', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getdefaultencoding', 'getrecursionlimit', 'getrefcount', 'hexversion', 'last_traceback', 'last_type', 'last_value', 'maxint', 'maxunicode', 'modules', 'path', 'platform', 'prefix', 'ps1', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'version', 'version_info', 'warnoptions', 'winver'] ---- | [[python:python-range|forrige]] | [[python:index|hjem]] | [[python:python-tid|næste]] | | Range | [[python:python-library-ref|op]] | Tidsfunktioner |