User Tools

Site Tools


linuxbog:python:python-filer
Linux – Friheden til at programmere i Python: Version 1.0.20040516 – 2020-12-31
forrige Kapitel 3. Biblioteks reference 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
<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']

forrige hjem næste
Range op Tidsfunktioner
linuxbog/python/python-filer.txt · Last modified: by 127.0.0.1

Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki

Brug af AI : Al tekst kán være uddrag af AI genereret tekst og kan være fejlbehæftet.
AI kan lave fejl og det kan mennesker også, men al tekst er gennemgået af et menneske for fejl, og personlig bias kan være tilføjet.