HSG |
|
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'.
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.
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
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.
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)
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()