Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 19 Datenspeicherung
  Pfeil 19.1 Komprimierte Dateien lesen und schreiben – gzStandardbibliothekgzipip
  Pfeil 19.2 XML
    Pfeil 19.2.1 DOM – Document Object Model
    Pfeil 19.2.2 SAX – Simple API for XML
    Pfeil 19.2.3 ElementTree
  Pfeil 19.3 Datenbanken
    Pfeil 19.3.1 Pythons eingebaute Datenbank – sqlite3
    Pfeil 19.3.2 MySQLdb
  Pfeil 19.4 Serialisierung von Instanzen – pickle
  Pfeil 19.5 Das Tabellenformat CSV – csv
  Pfeil 19.6 Temporäre Dateien – tempfile


Galileo Computing - Zum Seitenanfang

19.5 Das Tabellenformat CSV – csv  topZur vorigen Überschrift

Ein sehr verbreitetes Import- und Exportformat für Datenbanken und Tabellenkalkulationen ist das CSV-Format (für Comma Separated Values). CSV-Dateien sind Textdateien, die zeilenweise Datensätze enthalten. Innerhalb der Datensätze sind die einzelnen Werte durch ein Trennzeichen wie beispielsweise das Komma voneinander getrennt, daher auch der Name.

Eine CSV-Datei, die Informationen zu Personen speichert und das Komma als Trennzeichen nutzt, könnte beispielsweise so aussehen:

vorname,nachname,geburtsdatum,wohnort,haarfarbe 
Daniel,Zakowski,29.11.1987,Dinslaken,Schwarz 
David,Schönauer,10.09.1988,Aachen,Braun 
Sebastian,Sentner,06.09.1987,Sydney,Dunkelblond 
Jan,Fitzke,13.09.1987,Köln,Schwarz 
Lucas,Hövelmann,25.03.1988,Canberra,Hellrot

Die erste Zeile enthält die jeweiligen Spaltenköpfe, und alle folgenden Zeilen enthalten die eigentlichen Datensätze.

Leider existiert kein Standard für CSV-Dateien, sodass sich beispielsweise das Trennzeichen von Programm zu Programm unterscheiden kann. Dieser Umstand erschwert es, CSV-Dateien von verschiedenen Quellen zu lesen, da immer auf das besondere Format der exportierenden Anwendung eingegangen werden muss.

Um trotzdem mit CSV-Dateien der verschiedensten Formate umgehen zu können, stellt Python das Modul csv zur Verfügung. Das csv-Modul implementiert reader- und writer-Klassen, die den Lese- bzw. Schreibzugriff auf CSV-Daten kapseln. Mithilfe sogenannter Dialekte kann dabei das Format der Datei angegeben werden. Standardmäßig gibt es vordefinierte Dialekte für die CVS-Dateien, die von Microsoft Excel generiert werden. Außerdem stellt das Modul eine Klasse namens Sniffer (dt. Schnüffler) bereit, die den Dialekt einer Datei erraten kann.

Eine Liste aller definierten Dialekte kann man mit csv.list_dialects erhalten:

>>> import csv 
>>> csv.list_dialects() 
['excel-tab', 'excel']

reader-Objekte

Mithilfe von reader-Objekten können CSV-Dateien gelesen werden. Der Konstruktor sieht dabei folgendermaßen aus:

csv.reader(csvfile[, dialect][, fmtparam])

Der Parameter csvfile muss eine Referenz auf ein für den Lesezugriff geöffnetes Dateiobjekt sein, aus dem die Daten gelesen werden sollen. Die Dateiobjekte sollten dabei im Binärmodus ("rb") geöffnet worden sein, weil es sonst auf manchen Plattformen Probleme geben kann.

Mit dialect kann angegeben werden, in welchem Format die zu lesende Datei geschrieben wurde. Dazu kann als dialect ein String übergeben werden, der in der Liste enthalten ist, die csv.list_dialects zurückgibt. Alternativ kann eine Instanz der Klasse Dialect angegeben werden, die wir später besprechen werden. Standardmäßig wird der Wert "excel" für dialect verwendet, wobei die damit kodierten Dateien das Komma als Trennzeichen verwenden.

Der Platzhalter fmtparam steht nicht für einen einzelnen Parameter, sondern für Schlüsselwortparameter, die übergeben werden können, um den Dialekt ohne Umweg über die Dialect-Klasse festzulegen. Ein Beispiel, bei dem wir auf diese Weise das Semikolon als Trennzeichen zwischen den einzelnen Werten festlegen, sieht folgendermaßen aus:

>>> reader = csv.reader(open("datei.csv", "rb"), delimiter=";")

Wir werden uns später ausführlich mit Dialekten beschäftigen.

Die reader-Instanzen implementieren das Iterator-Protokoll und lassen sich deshalb komfortabel mit einer for-Schleife verarbeiten. Im folgenden Beispiel lesen wir die CSV-Datei mit den Personen aus der Einleitung:

>>> reader = csv.reader(open("namen.csv", "rb")) 
>>> for row in reader: 
        print row 
['vorname', 'nachname', 'geburtsdatum', 'wohnort', 'haarfarbe'] 
['Daniel', 'Zakowski', '29.11.1987', 'Dinslaken', 'Schwarz'] 
['David', 'Sch\xf6nauer', '10.09.1988', 'Aachen', 'Braun'] 
['Sebastian', 'Sentner', '06.09.1987', 'Sydney', 'Dunkelblond'] 
['Jan', 'Fitzke', '13.09.1987', 'K\xf6ln', 'Schwarz'] 
['Lucas', 'H\xf6velmann', '25.03.1988', 'Canberra', 'Hellrot']

Wie Sie sehen, gibt uns der reader für jede Zeile eine Liste mit den Werten der einzelnen Spalten zurück. Wichtig ist dabei, dass die Spaltenwerte immer als Strings zurückgegeben werden.

Neben dem Standard-reader, der Listen zurückgibt, existiert noch der sogenannte DictReader, der für jede Zeile ein Dictionary erzeugt, das den Spaltenköpfen die Werte der jeweiligen Zeile zuordnet.

Unser letztes Beispiel verändert sich durch die Verwendung von DictReader wie folgt, wobei wir nur die ersten beiden Datensätze ausgeben, um Platz zu sparen:

>>> reader = csv.DictReader(open("namen.csv", "rb")) 
>>> for row in reader: 
        print row 
{'nachname': 'Zakowski', 'geburtsdatum': '29.11.1987', 'wohnort':  
'Dinslaken', 'vorname': 'Daniel', 'haarfarbe': 'Schwarz'} 
{'nachname': 'Sch\xf6nauer', 'geburtsdatum': '10.09.1988',  
'wohnort': 'Aachen', 'vorname': 'David', 'haarfarbe': 'Braun'}

writer-Objekte

Der Konstruktor der writer-Klasse erwartet die gleichen Parameter wie der Konstruktor der reader-Klasse, mit der Ausnahme, dass das für csvfile übergebene Dateiobjekt für den Schreibzugriff im Binärmodus ("wb") geöffnet worden sein muss.

csv.reader(csvfile[, dialect][, fmtparam])

Das resultierende writer-Objekt hat die beiden Methoden writerow und writerows, mit denen sich einzelne bzw. mehrere Zeilen auf einmal in die CSV-Datei schreiben lassen:

>>> writer = csv.writer(open("autos.csv", "wb")) 
>>> writer.writerow(["marke", "modell", "leistung_in_ps"]) 
>>> daten = ( 
    ["Volvo", "P245", "130"], ["Ford", "Focus", "90"], 
    ["Mercedes", "CLK", "250"], ["Audi", "A6", "350"], 
    ) 
>>> writer.writerows(daten)

In dem Beispiel erzeugen wir eine neue CSV-Datei mit dem Namen "autos.csv". Mit der writerow-Methode schreiben wir die Spaltenköpfe in die erste Zeile der neuen Datei und mit writerows anschließend vier Beispieldatensätze.

Analog zur DictReader-Klasse existiert auch eine DictWriter-Klasse, die sich fast genauso wie die normale writer-Klasse erzeugen lässt, außer dass neben dem Dateiobjekt noch eine Liste mit den Spaltenköpfen übergeben werden muss. Für ihre writerow- und writerows-Methoden erwarten DictWriter-Instanzen Dictionarys als Parameter. Das folgende Beispiel erzeugt die gleiche CSV-Datei wie das letzte:

>>> writer = csv.DictWriter(open("autos.csv", "wb"), 
                   ["marke", "modell", "leistung_in_ps"]) 
 
>>> writer.writerow({"marke" : "marke", "modell" : "modell", 
                     "leistung_in_ps" : "leistung_in_ps"}) 
>>> daten = ({"marke" : "Volvo", "modell" : "P245", 
              "leistung_in_ps" : "130"}, 
             {"marke" : "Ford", "modell" : "Focus", 
              "leistung_in_ps" : "90"}, 
             {"marke" : "Mercedes", "modell" : "CLK", 
              "leistung_in_ps" : "250"}, 
             {"marke" : "Audi", "modell" : "A6", 
              "leistung_in_ps" : "350}) 
>>> writer.writerows(daten)

Die merkwürdige Zeile mit writerow ist notwendig, um die Spaltenköpfe zu schreiben, da dies nicht automatisch geschieht.

Dialect-Objekte

Die Instanzen der Klasse csv.Dialect dienen dazu, den Aufbau von CSV-Dateien zu beschreiben. Sie sollten Dialect-Objekte nicht direkt erzeugen, sondern stattdessen die Funktion csv.register_dialect verwenden. Mit register_dialect können Sie einen neuen Dialekt erzeugen und mit einem Namen versehen. Dieser Name kann dann später als Parameter an die Konstruktoren der reader- und writer-Klassen übergeben werden. Außerdem ist jeder registrierte Name in der von csv.get_dialects zurückgegebenen Liste enthalten.

Die Funktion register_dialect hat folgende Schnittstelle:

csv.register_dialect(name[, dialect][, fmtparam])

Der Parameter name muss dabei ein String sein, der den neuen Dialekt identifizieren soll. Mit dialect kann ein bereits bestehendes Dialect-Objekt übergeben werden, das dann mit dem entsprechenden Namen verknüpft wird.

Am wichtigsten ist der Platzhalter fmtparam, der für eine Reihe optionaler Schlüsselwortparameter steht, die den neuen Dialekt beschreiben. Es sind die in der folgenden Tabelle aufgeführten Parameter erlaubt:


Tabelle 19.9  Schlüsselwortparameter für register_dialect
Name Bedeutung

delimiter

Trennzeichen zwischen den Spaltenwerten. Der Standardwert ist das Komma (,).

quotechar

Zeichen, um Felder zu umschließen, die besondere Zeichen wie das Trennzeichen oder den Zeilenumbruch enthalten. Der Standardwert sind die doppelten Anführungszeichen (").

doublequote

Ein boolescher Wert, der angibt, wie das für quotechar angegebene Zeichen innerhalb von Feldern selbst maskiert werden soll.

Hat doublequote den Wert True, so wird quotechar zweimal hintereinander eingefügt. Ist der Wert von doublequote False, wird stattdessen das für escapechar angegebene Zeichen vor quotechar geschrieben.

Standardmäßig hat doublequote den Wert True.

escapechar

Ein Zeichen, das benutzt wird, um das Trennzeichen innerhalb von Spaltenwerten zu maskieren, sofern quoting den Wert QUOTE_NONE hat.

Bei einem dobulequote-Wert von False wird escapechar außerdem für die Maskierung von den quotechar verwendet.

Standardmäßig ist die Maskierung deaktiviert und escapechar hat den Wert None.

lineterminator

Zeichen, das zum Trennen der Zeilen benutzt wird. Standardmäßig ist es auf "\r\n" gesetzt.

Bitte beachten Sie, dass diese Einstellung nur den Writer betrifft. Alle reader-Objekte bleiben von der lineterminator-Einstellung unbeeinflusst und verwenden immer "\r", "\n" oder die Kombination aus beiden als Zeilentrennzeichen.

quoting

Gibt an, ob und wann Spaltenwerte mit quotechar umschlossen werden sollen.

Gültige Werte sind:

QUOTE_ALL – Alle Spaltenwerte werden umschlossen.

QUOTE_MINIMAL – Nur die Felder mit speziellen Zeichen wie Zeilenvorschüben oder dem Trennzeichen für Spaltenwerte werden umschlossen.

QUOTE_NONNUMERIC – Beim Schreiben werden alle nicht-numerischen Felder von quotechar umschlossen. Beim Lesen werden alle nicht umschlossenen Felder automatisch nach float konvertiert.

QUOTE_NONE – Keine Umschließung mit quotechar wird vorgenommen.

Standardmäßig ist quoting auf QUOTE_MINIMAL eingestellt.

skipinitialspace

Ein boolescher Wert, der angibt, wie mit führenden Whitespaces in einem Spaltenwert verfahren werden soll.

Eine Einstellung auf True bewirkt, dass alle führenden Whitespaces ignoriert werden; bei einem Wert von False wird der komplette Spalteninhalt gelesen und zurückgegeben.

Der Standardwert ist False.


Wir wollen als Beispiel einen neuen Dialekt namens "mein_dialekt" registrieren, der als Trennzeichen den Tabulator verwendet und alle Felder mit Anführungszeichen umschließt:

>>> csv.register_dialect("mein_dialekt", delimiter="\t", 
                                         quoting=csv.QUOTE_ALL)

Diesen neuen Dialekt können wir nun dem Konstruktor unserer reader- und writer-Klassen übergeben und auf diese Weise unsere eigenen CSV-Dateien schreiben und lesen.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python
Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Einstieg in Python






 Einstieg in Python


Zum Katalog: Silverlight 4






 Silverlight 4


Zum Katalog: Python 3






 Python 3


Zum Katalog: JavaScript






 JavaScript


Zum Katalog: jQuery






 jQuery


Zum Katalog: CSS






 CSS


Zum Katalog: Einstieg in XML






 Einstieg in XML


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
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.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de