HSG

Aktuelle Seite: HSG/Fächer/Informatik/Python

Datei einlesen

datei = open('hallo.txt','r')
s = datei.read()
datei.close()

print(s)

In der ersten Zeile wird ein neues 'Datei-Objekt' geschaffen. Dabei werden Parameter wie der Dateiname 'hallo.txt' oder die Art des Umgangs 'r' mitgeteilt. 'r' zeigt, dass die Datei nur zum Lesen geöffnet wird. Lässt man den zweiten Parameter weg, so wird 'r' angenommen. Dass das Dateiobjekt hier datei heißt, ist willkürlich. Das Schlüsselwort 'file' bedeutet Datei. 'file' kann auch durch 'open' ersetzt werden. Tatsächlich wird die Datei beim Erschaffen des Datei-Objekts bereits geöffnet. Man kann sich ein Objekt als eine Person vorstellen, die für bestimmte Aufgaben zuständig und kompetent ist. Einer solchen Person kann man Aufträge erteilen oder auch Fragen stellen. So stellt datei.read() an das Objekt die Frage nach dem Inhalt der Datei. Die Antwort wird in der Anweisung s = datei.read() mit der Variablen s bezeichnet. s ist vom Datentyp string. Mit datei.close() gibt man dem Datei-Objekt den Befehl, die Datei zu schließen. In Python werden Objekte, die nicht mehr gebraucht werden, automatisch 'entsorgt'.

Vorsicht!

Enthält der zweite Parameter kein b, also z.B. NICHT 'rb', so wird die Datei als Textdatei interpretiert, dh. die Bytes der Datei werden implizit unter der Benutzung der System-Codierung in einen String umgewandelt.

Aufgaben

  • Erstelle mit einem Text-Editor eine Datei 'hallo.txt' und teste das Einführungsbeispiel.
  • Erstelle mit Python eine kleine Textdatei mit drei Zeilen auf Laufwerk h: .
  • Wie gibt man in Python Pfade zu Unterverzeichnissen an? Welche Bedeutung hat gewöhnlich '\'? Denke z.B. an \n .

Labyrinth (Liste von int-Listen) schreiben und lesen

Grundsätzlich soll Information bzw. Daten human readable gespeichert werden. Im Allgemeinen enthält eine solche Datei nur ASCII-Zeichen. Beim Schreiben und Lesen müssen also typischerweise Typumwandlungen durchgeführt werden. Im vorliegenden Beispiel wird aus der Textdatei

3 3 1 2
2 3 0 2
2 1 0 2
1 1 1 0

die Liste [[3, 3, 1, 2], [2, 3, 0, 2], [2, 1, 0, 2], [1, 1, 1, 0]] und umgekehrt.

def schreibeDatei(z,name):
    datei = open(name,'w')
    maxZnr = len(z)-1                          # maximale Zeilennummer
    maxSnr = len(z[0])-1                       # maximale Spaltennummer
    Znr = 0                                    # Znr = Zeilennummer
    while Znr <= maxZnr:
        Snr = 0                                # Snr = Spaltennummer
        s = ''                                 # s = String
        while Snr <= maxSnr:
            s = s+str(z[Znr][Snr])+' '         # Typumwandlung, typecast
            Snr = Snr+1
        s = s+'\n'
        datei.write(s)
        Znr = Znr+1
    datei.close()

def liesDatei(name):
    datei = open(name,'r')
    z = []                                     # z Zellen, Liste von Listen
    for s in datei:                            # s durchläuft die Zeilen als String
        zeilenliste = []
        for i in s.split(' ')[:-1]:
            zeilenliste = zeilenliste+[int(i)] # typecast
        z = z+[zeilenliste]
    datei.close()
    return z

Binärdatei

Bei einer Binärdatei muss man laut der 3.1 Dokumentation zu open den Modus als 'b' angeben. 'Lesen' und 'binär' also zusammen 'rb'. Die Beispieldatei hat laut Dateisystem 1 488 316 Byte.

hex 1

datei = open('bild1-klein.ppm','rb')   # r für Lesen, b für Binärmode
s = datei.read()                       # ganze Datei in s eingelesen
datei.close()
print('Größe der Datei: ',len(s))
i = 0
n = 0
while n < 3:
    if int(s[i]) == 10:
        n = n + 1
    i = i + 1
print('Daten beginnen bei Byte ',i)
print('Erste 3 Pixel-Daten als Zeichen: ',s[i:i+9])
d = []
for k in range(i,i+9,1):
    d = d + [int(s[k])]
print('Erste 3 Pixel-Daten als Listen von integer-Werten: ',d)

Shell 1

Weiteres Beispiel

abstimmung.txt:

ja 0
nein 3

datei1.py:

# Dateiinhalt in Zeilen ablegen
datei = open('abstimmung.txt','r')
z = datei.read().split('\n')
datei.close()
print(z) # DEBUG

# Dateiinhalt analysieren
zJa = int(z[0].split(' ')[1])
print zJa # DEBUG
zNein = int(z[1].split(' ')[1])
print zNein # DEBUG

# Abfrage
antwort = raw_input('Ihre Wahl(ja/nein): ')
if antwort == 'ja':
    zJa = zJa+1
else:
    zNein = zNein+1

# Ausgabe vorbereiten
s = 'ja '+str(zJa)+'\nnein '+str(zNein)

# Datei schreiben
datei = open('abstimmung.txt','w')
datei.write(s)
datei.close()

Links