Dateiverarbeitung in Python
Schreiben einer Datei
- Ausgabe einer Textdatei
with open( 'tmp.txt', 'r' )as file: print( file.read() )
- Lesen einer Zeile
line = file.readline()
for line in file: # enthält Zeilenende
- Lesen aller Zeilen
lines = ''.join( file.readlines() )
- Schreiben
file.write( 'txt' )
file.writelines( list )
Unterschiede zu »print«:
- Das Argument von »write« muß (bei Textdateien) den Typ »str« haben, während »print« Argumente anderer Typen automatisch umwandelt und
- »write« akzeptiert nur ein einziges Argument, während »print« mehrere Argumente und Optionen akzeptiert.
- Anhängen
fh = open("Hello.txt", "a")
main.py
with open( 'output.txt', 'w' ) as file:
file.write( 'text' )
print( 'example', file=f, flush=True )
main.py
file = open( 'output.txt', 'w' )
file.write( 'text' )
print( 'more text', file=f )
file.close()
main.py
from contextlib import redirect_stdout
file = open( 'output.txt', 'w' )
with redirect_stdout( file ):
print( 'example' )
Beispiel
Eine Datei »quelle.txt« soll ausgegeben werden, aber ohne die Zeilen aus der Datei »stopp.txt«.
- quelle.txt
Anton
Dora
Heinrich
Nordpol
Berta- stopp.txt
Nordpol
Dora- main.py
import fileinput
quelle = fileinput.input( 'quelle.txt' )
stopp = list( fileinput.input( 'stopp.txt' ))
ergebnis =[ zeile for zeile in quelle if zeile not in stopp ]
for zeile in ergebnis: print( end=zeile )
Beispiel
Eine Datei mit Zeilen, die aus einem Text und einem durch ein Komma abgetrennten Numerale bestehen, soll nach den Zahlenwerte der Numeralia sortiert werden.
input.txt
zeta,20
alpha,30
beta,10main.py
import fileinput
a = list( fileinput.input( 'input.txt' )) # Einlesen
a.sort( key = lambda line: int( line.split( ',' )[ 1 ])) # Verarbeiten
for line in a: print( end=line ) # Ausgeben
- Übersetzungshinweise
- input Eingabe
- key Schlüssel (Sortierschlüssel)
- line Zeile
- to split Aufteilen, Zerlegen
- Ausgabe (Bildschirm)
beta,10
zeta,20
alpha,30
Bei dieser einfachen Lösung darf die Quelldatei keine Leerzeilen enthalten, aber muß mit einem Zeilenende enden.
- Richtige Eingabe mit sichtbar gemachten Zeilenenden
zeta,20↵
beta,10↵- Falsche Eingabe (ein Zeilenende zuviel)
zeta,20↵
beta,10↵
↵- Falsche Eingabe (ein Zeilenende zuwenig)
zeta,20↵
beta,10
Beispiel
- main.py
import fileinput
import re
for line in fileinput.input():
line = re.sub( '`(.*)`', lambda x: eval( x.group( 1 )), line.rstrip())
print( line )
- input:
puts("`'*'*50`");
- output:
puts("**************************************************");
Beispiel
- main.py
import os
with open( 'tmp.cmd', 'w' ) as file:
print \
( \
# program
r'ECHO '
# example
r'EXAMPLE '
, file=file, flush=True )
print( 'PAUSE', file=file, flush=True )
os.system("C:\Windows\System32\cmd.exe /k tmp.cmd")
input()
Beispiel
Schreiben eines CHRS-Chunks (IFF) in eine Binärdatei.
main.py
class chunk():
def __init__( my, type=None, size=None ):
my.type = type
my.size = sizeclass chunk_CHRS( chunk ):
class size_too_large( Exception ):
passclass unprepared_write_attempt( Exception ):
passclass no_text_given( Exception ):
passdef __init__( my, text=None ):
chunk.__init__( my, b'CHRS', None )
my.set_text( text )def set_text( my, text=None ):
my.text = text
my.data = None
my.prepared = Falsedef prepare_for_writing( my ):
if my.text == None: raise no_text_given()
my.data = my.text.encode( 'utf-8' )
l = len( my.data )
if l > 2**32-1: raise size_too_large()
my.size = l
my.prepared = Truedef write_to_file( my, file ):
if not my.prepared: raise unprepared_write_attempt()
if my.size > 2**32-1: raise size_too_large()
file.write( my.type )
file.write( my.size.to_bytes( 4, byteorder='big', signed=False ))
file.write( my.data )def write_CHRS( file, text ):
chunk = chunk_CHRS( text )
chunk.prepare_for_writing()
chunk.write_to_file( file )with open( 'test20181214215507.txt', 'wb' ) as file:
write_CHRS( file, 'example' )
import chunk
with open( 'test20181214215507.txt', 'rb' ) as file:
c = chunk.Chunk( file )
print( c.getname() )
print( c.getsize() )
print( c.read( c.getsize() ))
c.close()
- transcript
b'CHRS'
7
b'example'
Gruppieren
main.py
tmpfilename = 'tmp20190430143402DML.txt'
with open( tmpfilename, 'w' )as file:
file.write( '''1 John
1 Erik
1 Simon
2 Alex
2 Suse
3 Paul
3 Matze
3 Katrin
3 Dani
''' )from collections import defaultdict
d = defaultdict( list )
with open( tmpfilename, 'r' ) as sourcefile:
for line in sourcefile:
l = line.split( ' ' )
d[ l[ 0 ]].append( l[ 1 ][ :-1 ])for key in d:
print( key, ' '.join( d[ key ] ))- transcript
1 John Erik Simon
2 Alex Suse
3 Paul Matze Katrin Dani
Logfile auswerten
"URI","referrer"
"URI","referrer"
"URI","referrer"
referrer zusammenfassen und nach Häufigkeit sortiert ausgeben
import operator
import re
import sys
from collections import Counter
referrers = Counter()
def f( matcher ):
URI = matcher.group( 1 )
referrer = matcher.group( 2 )
referrers[ referrer ]+= 1
n = 0
with open( r'logfile.txt', 'rb' )as logfile:
for logline in logfile:
n += 1
s = re.sub( rb'"([^"]*)",'*2, f, logline + b"," )
if n % 100000 == 0: print(n)
for( i, j )in sorted( Referrers.items(), key=operator.itemgetter( 1 ), reverse=True ):
print( j, i )
Suchen und Ersetzen in binärer Datei
with open( "transcript.txt", "rb" )as f:
d = f.read()
d = d.replace( b"\x0D\x0A", b"\x0B" )
with open( "transcript.txt", "wb" )as f:
f.write(content)