Rheinwerk Computing < openbook >

 
Inhaltsverzeichnis
1 Einleitung
2 Die Programmiersprache Python
Teil I Einstieg in Python
3 Erste Schritte im interaktiven Modus
4 Der Weg zum ersten Programm
5 Kontrollstrukturen
6 Dateien
7 Das Laufzeitmodell
8 Funktionen, Methoden und Attribute
9 Informationsquellen zu Python
Teil II Datentypen
10 Das Nichts – NoneType
11 Operatoren
12 Numerische Datentypen
13 Sequenzielle Datentypen
14 Zuordnungen
15 Mengen
16 Collections
17 Datum und Zeit
18 Aufzählungstypen – Enum
Teil III Fortgeschrittene Programmiertechniken
19 Funktionen
20 Modularisierung
21 Objektorientierung
22 Ausnahmebehandlung
23 Iteratoren
24 Kontextobjekte
25 Manipulation von Funktionen und Methoden
Teil IV Die Standardbibliothek
26 Mathematik
27 Kryptografie
28 Reguläre Ausdrücke
29 Schnittstelle zu Betriebssystem und Laufzeitumgebung
30 Kommandozeilenparameter
31 Dateisystem
32 Parallele Programmierung
33 Datenspeicherung
34 Netzwerkkommunikation
35 Debugging und Qualitätssicherung
36 Dokumentation
Teil V Weiterführende Themen
37 Anbindung an andere Programmiersprachen
38 Distribution von Python-Projekten
39 Grafische Benutzeroberflächen
40 Python als serverseitige Programmiersprache im WWW – ein Einstieg in Django
41 Wissenschaftliches Rechnen
42 Insiderwissen
43 Von Python 2 nach Python 3
A Anhang
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 464 KB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Python 3 von Johannes Ernesti, Peter Kaiser
Das umfassende Handbuch
Buch: Python 3

Python 3
Pfeil 6 Dateien
Pfeil 6.1 Datenströme
Pfeil 6.2 Daten aus einer Datei auslesen
Pfeil 6.3 Daten in eine Datei schreiben
Pfeil 6.4 Das Dateiobjekt erzeugen
Pfeil 6.4.1 open(filename, [mode, buffering, encoding, errors, newline])
Pfeil 6.4.2 Attribute und Methoden eines Dateiobjekts
Pfeil 6.4.3 Die Schreib-/Leseposition verändern
 
Zum Seitenanfang

6.4    Das Dateiobjekt erzeugen Zur vorigen ÜberschriftZur nächsten Überschrift

Wie aus den vorangegangenen Beispielen ersichtlich wurde, kann ein Dateiobjekt über die Built-in Function open erzeugt werden. Dieser Funktion können neben dem Dateinamen und dem Modus noch weitere Parameter übergeben werden, auf die sich ein Blick lohnt. Außerdem gibt es neben den bereits gezeigten Modi "r" und "w" noch einige weitere, die im Folgenden besprochen werden. Zum Schluss geben wir Ihnen noch einen Überblick über die Methoden des resultierenden Dateiobjekts.

 
Zum Seitenanfang

6.4.1    open(filename, [mode, buffering, encoding, errors, newline]) Zur vorigen ÜberschriftZur nächsten Überschrift

Die Built-in Function open öffnet eine Datei und gibt das erzeugte Dateiobjekt zurück. Mithilfe dieses Dateiobjekts können Sie nachher die gewünschten Operationen auf der Datei durchführen.

Die ersten beiden Parameter haben wir in den vorangegangenen Abschnitten bereits besprochen. Dabei handelt es sich um den Dateinamen bzw. den Pfad zur zu öffnenden Datei und um den Modus, in dem die Datei zu öffnen ist. Für den Parameter mode muss ein String übergeben werden, wobei alle gültigen Werte und ihre Bedeutung in Tabelle 6.1 aufgelistet sind:

Modus Beschreibung
"r" Die Datei wird ausschließlich zum Lesen geöffnet.
"w" Die Datei wird ausschließlich zum Schreiben geöffnet. Eine eventuell bestehende Datei gleichen Namens wird überschrieben.
"a" Die Datei wird ausschließlich zum Schreiben geöffnet. Eine eventuell bestehende Datei gleichen Namens wird nicht überschrieben, sondern erweitert.
"x" Die Datei wird ausschließlich zum Schreiben geöffnet, sofern sie nicht bereits existiert. Wenn bereits eine Datei gleichen Namens vorhanden ist, wird eine FileExistsError-Exception geworfen.
"r+", "w+", "a+", "x+" Die Datei wird zum Lesen und Schreiben geöffnet. Beachten Sie, dass "w+" eine eventuell bestehende Datei gleichen Namens leert.
"rb", "wb", "ab", "xb", "r+b", "w+b", "a+b", "x+b" Die Datei wird im Binärmodus geöffnet. Beachten Sie, dass in diesem Fall bytes-Instanzen anstelle von Strings verwendet werden müssen.

Tabelle 6.1    Dateimodi

Der Parameter mode ist optional und wird als "r" angenommen, wenn er weggelassen wird.

Über den vierten, optionalen Parameter encoding kann das Encoding[ 18 ](Das Encoding legt fest, wie Sonderzeichen, die über den ASCII-Zeichensatz hinausgehen, abgespeichert werden. Näheres zu Encodings in Python erfahren Sie im Zusammenhang mit Strings in Abschnitt 13.4.4, »Zeichensätze und Sonderzeichen«. Dort finden Sie auch nähere Informationen zu den Parametern encoding und errors. ) festgelegt werden, in dem die Datei gelesen bzw. geschrieben werden soll. Die Angabe eines Encodings ergibt beim Öffnen einer Datei im Binärmodus keinen Sinn und sollte in diesem Fall weggelassen werden. Der fünfte Parameter errors bestimmt, wie mit Fehlern bei der Codierung von Zeichen im angegebenen Encoding verfahren werden soll. Wird für errors der Wert "ignore" übergeben, werden di26ese ignoriert. Bei einem Wert von "strict" wird eine ValueError-Exception geworfen, was auch das Verhalten ist, wenn der Parameter nicht angegeben wird.

Der Parameter buffering steuert die interne Puffergröße, und newline legt die Zeichen fest, die beim Lesen oder Schreiben der Datei als Newline-Zeichen erkannt bzw. verwendet werden sollen.

 
Zum Seitenanfang

6.4.2    Attribute und Methoden eines Dateiobjekts Zur vorigen ÜberschriftZur nächsten Überschrift

Die beim Öffnen angegebenen Parameter können über die Attribute name, encoding, errors, mode und newlines des resultierenden Dateiobjekts wieder gelesen werden.

Tabelle 6.2 fasst die wichtigsten Methoden eines Dateiobjekts kurz zusammen. Auf die Methoden seek und tell werden wir im folgenden Abschnitt noch einmal detaillierter eingehen.

Methode Beschreibung
close() Schließt ein bestehendes Dateiobjekt. Beachten Sie, dass danach keine Lese- oder Schreiboperationen mehr durchgeführt werden dürfen.
fileno() Gibt den Deskriptor* der geöffneten Datei als ganze Zahl zurück.
flush() Verfügt, dass anstehende Schreiboperationen sofort ausgeführt werden.**
isatty() True, wenn das Dateiobjekt auf einem Datenstrom geöffnet wurde, der nicht an beliebiger Stelle geschrieben oder gelesen werden kann
next() Liest die nächste Zeile der Datei ein und gibt sie als String zurück.
read([size]) Liest size Bytes der Datei ein oder weniger, wenn vorher das Ende der Datei erreicht wurde. Sollte size nicht angegeben sein, wird die Datei vollständig eingelesen.
Die Daten werden abhängig vom Lesemodus als String oder bytes-String zurückgegeben.
readline([size]) Liest eine Zeile der Datei ein. Durch Angabe von size lässt sich die Anzahl der zu lesenden Bytes begrenzen.
readlines([sizehint]) Liest alle Zeilen und gibt sie in Form einer Liste von Strings zurück. Sollte sizehint angegeben sein, wird nur gelesen, bis ungefähr sizehint Bytes gelesen wurden.***
seek(offset, [whence]) Setzt die aktuelle Schreib-/Leseposition in der Datei auf offset.
tell() Liefert die aktuelle Schreib-/Leseposition in der Datei.
truncate([size]) Löscht in der Datei alle Daten, die hinter der aktuellen Schreib-/Leseposition stehen, bzw. – sofern angegeben – alles außer den ersten size Bytes.
write(str) Schreibt den String str in die Datei.
writelines(iterable) Schreibt mehrere Zeilen in die Datei. Das iterierbare Objekt iterable muss Strings durchlaufen, möglich ist zum Beispiel eine Liste von Strings.
* Ein Dateideskriptor (engl. file descriptor) ist eine vom Betriebssystem vergebene Identifikationsnummer für geöffnete Dateien. Die Standardströme stdin und stdout haben die Deskriptoren 0 bzw. 1.
** Das Betriebssystem kann anstehende Dateioperationen aus Effizienzgründen puffern und zu einem späteren Zeitpunkt ausführen. Dies ist zum Beispiel der Grund dafür, dass USB-Sticks nicht herausgezogen werden sollten, ohne sie beim Betriebssystem abzumelden.
*** In diesem Zusammenhang bedeutet »ungefähr«, dass die Anzahl der zu lesenden Bytes möglicherweise zu einer internen Puffergröße aufgerundet wird.

Tabelle 6.2    Methoden eines Dateiobjekts

 
Zum Seitenanfang

6.4.3    Die Schreib-/Leseposition verändern Zur vorigen ÜberschriftZur nächsten Überschrift

Die bisherigen Beispiele haben gezeigt, wie Dateien in einer sequenziellen Art und Weise gelesen bzw. geschrieben werden können. Aufgrund der speziellen Natur von Dateien ist es möglich, die Schreib- bzw. Leseposition beliebig zu verändern. Dazu existieren die Methoden seek und tell des Dateiobjekts.

seek(offset, [whence])

Die Methode seek eines Dateiobjekts setzt die Schreib-/Leseposition innerhalb der Datei. Sie ist das Gegenstück zur Methode tell, die die aktuelle Schreib-/Leseposition zurückgibt.

[»]  Hinweis

Die Methode seek hat im Modus "a" keine Wirkung. Im Modus "a+" wird die Schreib-/Leseposition verändert, sodass an beliebigen Stellen in der Datei gelesen werden kann, vor einer Schreiboperation wird sie aber zurückgesetzt.

Sollte die Datei im Binärmodus geöffnet worden sein, wird der Parameter offset in Bytes vom Dateianfang aus gezählt. Diese Interpretation von offset lässt sich durch den optionalen Parameter whence beeinflussen (siehe Tabelle 6.3).

Wert von whence Interpretation von offset
0 Anzahl Bytes relativ zum Dateianfang
1 Anzahl Bytes relativ zur aktuellen Schreib-/Leseposition
2 Anzahl Bytes relativ zum Dateiende

Tabelle 6.3    Der Parameter whence

Sie können seek nicht so unbeschwert verwenden, wenn die Datei im Textmodus geöffnet wurde. Hier sollten als offset nur Rückgabewerte der Methode tell verwendet werden. Abweichende Werte können zu undefiniertem Verhalten führen.

Im folgenden Beispiel wird die Methode seek verwendet, um Breite, Höhe und Farbtiefe einer Bitmap-Grafik[ 19 ](Das Windows-Bitmap-Dateiformat (Endung .bmp) ist ein weitverbreitetes Rastergrafikformat. ) zu bestimmen.

def bytes2int(b):
res = 0
for x in b[::-1]:
res = (res << 8) + x
return res
f = open("bild.bmp", "rb")
f.seek(18)
print("Breite:", bytes2int(f.read(4)), "px")
print("Höhe:", bytes2int(f.read(4)), "px")
f.seek(2, 1)
print("Farbtiefe:", bytes2int(f.read(2)), "bpp")
f.close()

Der Spezifikation des Bitmap-Dateiformats[ 20 ](Diese finden Sie zum Beispiel in der Wikipedia unter: http://de.wikipedia.org/wiki/Windows_Bitmap) kann man entnehmen, dass sich die gesuchten Informationen an den Offsets 18, 22 und 28 befinden, jeweils in Form von 4- bzw. 2-Byte-Werten. Wir öffnen daher die Datei bild.bmp zum Lesen im Binärmodus und überspringen mithilfe der Methode seek die ersten 18 Bytes. An dieser Stelle können wir Breite und Höhe der Grafik auslesen und ausgeben.[ 21 ](Sollte bei Ihnen eine negative Höhe ausgegeben werden, ist dies kein Fehler im Programm, sondern eine Eigenart des Bitmap-Dateiformats: Eine negative Höheninformation bedeutet, dass die Bilddaten von oben nach unten gespeichert sind und nicht, wie üblich, von unten nach oben. )

Von der aktuellen Leseposition aus überspringen wir zwei weitere Bytes (der Parameter whence ist beim seek-Aufruf auf 1 gesetzt) und können zwei Bytes auslesen, die die Farbtiefe des Bildes enthalten.[ 22 ](Die Farbtiefe wird in »Bits per Pixel« (BPP) angegeben. )

Die mittels read eingelesenen Werte werden als bytes-String zurückgegeben und müssen daher noch mithilfe von bytes2int in ganze Zahlen konvertiert werden. Die Funktion bytes2int durchläuft den übergebenen bytes-String rückwärts, also mit dem höchstwertigen Byte zuerst. Das aktuelle Zwischenergebnis wird immer binär um acht Stellen nach links geschoben und dann das nächstniedere Byte aufaddiert.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Python 3 Python 3
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Einstieg in Python
Einstieg in Python


Zum Rheinwerk-Shop: Python. Der Grundkurs
Python. Der Grundkurs


Zum Rheinwerk-Shop: Algorithmen mit Python
Algorithmen mit Python


Zum Rheinwerk-Shop: Objektorientierte Programmierung
Objektorientierte Programmierung


Zum Rheinwerk-Shop: Raspberry Pi. Das umfassende Handbuch
Raspberry Pi. Das umfassende Handbuch


Zum Rheinwerk-Shop: Roboter-Autos mit dem Raspberry Pi
Roboter-Autos mit dem Raspberry Pi


Zum Rheinwerk-Shop: Neuronale Netze programmieren mit Python
Neuronale Netze programmieren mit Python


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern