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
<module 'sys' (built-in)>

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']