Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 4: Dateien.

Ähnliche Präsentationen


Präsentation zum Thema: "Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 4: Dateien."—  Präsentation transkript:

1 Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung
Martin G. Schultz Teil 4: Dateien

2 Umgang mit Dateien Generell folgender Ablauf: Öffnen:
handle = open(filename, mode) Lesen oder Schreiben von Daten: handle.read() handle.write() handle.readline() handle.write(s+’\n’) handle.readlines() handle.writelines() Schließen: handle.close() wird automatisch in das richtige Umbruchzeichen für das Betriebssystem umgewandelt siehe auch:

3 Fehlerbehandlung Beim Umgang mit Dateien geht (fast) immer etwas schief. Daher: Probier es auch mal mit „w“ Fehler sollten immer spezifiziert werden f.closed kann benutzt werden, um zu Testen, ob eine Datei (noch) geöffnet ist.

4 ? Fehlerbehandlung (2) Warum nicht:
f ist nicht definiert, falls beim Öffnen etwas schiefgeht ?

5 Dateien in einem Rutsch
(integrierte Fehlerbehandlung mit „with“) Das with statement sorgt dafür, dass die Datei beim Verlassen des Programmblocks geschlossen wird (auch bei Fehlern) Ein f.close() ist damit erstens unnötig und führt zweitens zu einem Fehler. More info:

6 Das Open Statement f = open( filename [, mode [, buffering]] )
open ist der Konstruktor für das file Objekt … f = open( filename [, mode [, buffering]] ) filename: Name der Datei, u.U. inklusive Pfad (auch bei Windows immer ″/″!) mode: ″r″ : Lesen (default) ″r+″: Lesen und Schreiben ″w″: Schreiben ″a″: Anhängen ″b″: binärer Modus (als zweites Zeichen) buffering: 0 : unbuffered 1 : line buffered n > 1 : Puffergröße in Bytes n < 0 : system default

7 Lesen und Schreiben von Dateien
Das Dateiende wird durch einen leeren String angezeigt. Eine leere Zeile enthält stattdessen immer noch das „\n“ Zeichen. Daher wird content False, wenn das Dateiende erreicht ist. Drucke Sonderzeichen mit

8 Lesen/Schreiben von Binärdaten (1): tofile und fromfile
test2 wird nur die Größe haben, da automatisch der Typ float64 angenommen wird. Man muss also bei fromfile das Argument dtype=np.float32 angeben! Was geht hier schief? Wie kann man das verhindern? Anmerkung: tofile und fromfile können sowohl für binäre als auch für ascii Dateien verwendet werden. Für ascii Dateien gibt es sep=″″ und format=″%s″.

9 Lesen/Schreiben von Binärdaten (2): save und load
numpy.save merkt sich den Typ und die Form des Arrays. Bei np.save wird die Endung .npy automatisch angehängt.

10 Aufgaben Erzeuge zwei numpy arrays mit unterschiedlichen Datentypen und verschiedenen Größen. Schreibe beide Felder in eine Binärdatei. Benutze dafür numpy.save Benutze dafür array.tofile Nun lese beide Felder wieder aus der Datei aus mit numpy.load mit numpy.fromfile Tipp 1: Die Datei braucht zum Lesen für jede Teilaufgabe nur einmal geöffnet zu werden. Statt des Dateinamens kann der „handle“ an load bzw. fromfile übergeben werden. Tipp 2: numpy.fromfile kennt ein count Argument Beispiel: import numpy as np a1 = np.arange(0.1,10.,0.2,dtype=np.float32) a2 = np.empty((5,10), dtype=np.uint64) for i in range(5): a2[i] = [(v+1)**(i+1) for v in range(10)] with open("testfile2arrays.dat", "wb") as f: a1.tofile(f) a2.tofile(f) print "size of a1 : ", a1.size # need to know this! print "now reading ..." with open("testfile2arrays.dat", "rb") as f: a = np.fromfile(f, dtype=np.float32, count=50) b = np.fromfile(f, dtype=np.uint64) print a print b # --- numpy.save / load --- with open("testfile2arrays_v2.dat", "wb") as f: np.save(f, a1) np.save(f, a2) with open("testfile2arrays_v2.dat", "rb") as f: a = np.load(f) b = np.load(f)

11 Lesen/Schreiben beliebiger Python Objekte
Das pickle Modul # pickle.dump(a, f, -1) schreibt im Binärformat

12 einfachere Handhabung
Excel-Dateien 1. Excel Spreadsheets (.xls): xlrd, xlwt, xlutils modules  2. CSV files (.csv): csv.reader  numpy.loadtext() numpy.genfromtext() matplotlib.mlab.csv2rec() einfachere Handhabung

13 CSV-Dateien (1) Beispiel: Datei: temperature_wind_demo.csv csv2rec Lösung: Die Datumsspalte wird automatisch in datetime Objekte umgewandelt. Anschließend kann z.B. plot(data1[′time′], data1[′DD′]) oder plot(data1.time, data1.DD)angewendet werden. data1 ist ein sogenanntes numpy.recarray.

14 CSV-Dateien (2) numpy.genfromtxt Lösung: Hier wird aus der Datumsspalte ein numerischer (float64) Wert. Ansonsten ist auch data2 ein numpy.recarray. numpy.loadtxt Lösung:

15 CSV-Dateien (3) csv.reader Lösung:
data ist list of lists – muss in list of tuples umgewandelt werden, sonst streikt np.array!

16 CSV-Dateien: Analyse Alle 4 Beispiele erlauben das Einlesen der Daten in der CSV Datei Die einzelnen Variablen können jeweils namentlich angesprochen werden: data1.ff oder data1[ff ] data2[FF], data3[FF], data4[FF] Data1 ist ein numpy recarray, die anderen sind das nicht. Umwandlung möglich durch np.view(np.recarray) Data1 und data2 speichern die (float) Werte als float64, data3 und data4 als float32 Datumsformate: data1: datetime.datetime() Datumsstruktur (richtig erkannt) data2: float Zahlen ( etc.) data3: dto. data4: strings (S16), keine Umwandlung

17 Exkurs: numpy.recarray
Ein recarray ist ein (numpy) array mit spezifizierten Datentypen (dtypes). Der dtype gibt Datentyp, Feldnamen und Feldgröße an. Man kann auch „normale“ nparrays mit „records“ (also Kombinationen unterschiedlicher Datentypen) definieren: Durch Umwandlung in ein recarray wird es möglich, die einzelnen Bestandteile eines records als Attribute anzusprechen: r.name führt zu einem Fehler

18 Exkurs: Datumsformate
Datum und Zeit könnten locker Thema einer eigenen Vorlesung sein (verschiedene Kalender, Schaltsekunden, Lokalzeit, Sommerzeit, etc.). Für unsere Zwecke reichen in den meisten Fällen sog. „naive“ Datums- und Zeitangaben: der gegenwärtige gregorianische Kalender ist und war immer gültig es gibt keine Schaltsekunden die Interpretation einer Uhrzeit (Zeitzone) hängt vom Benutzer ab Mit der Klasse tzinfo kann man auch eindeutige (nicht naive) Zeitangaben machen. Python bietet verschiedene Module zum Umgang mit Daten und Zeiten: datetime time calendar dateutil

19 Exkurs: Datumsformate
datetime.timedelta wird für Zeitdifferenzen benutzt. Intern werden diese als Zahl der Tage, Sekunden und Mikrosekunden gespeichert. datetime.date speichert Datumsangaben als Tage seit dem ab („proleptischer gregorianischer Kalender“). datetime.time speichert Zeitangaben zwischen 00:00:00 h und 24:00:00 h – 1 µs. datetime.datetime kombiniert Datum und Zeit. Beispiele:

20 Exkurs: Datumsformate
Beispiele: Montag einmal 0 und einmal 1 Zahl der Tage seit 1.1.1 timedelta Achtung! Nicht -1:30:00 h Antwort: Hermann Flohn Achtung! Wir haben nur nach den Sekunden gefragt. Na? Wer war das wohl?

21 Exkurs: Datumsformate
„Unix“-Zeit: Zahl der Sekunden seit dem :00:00 h („timestamp“). Wird von time.time() zurückgegeben (s. numpy Zeitmessung) Matplotlib-Zeit: Zahl der Tage (mit Dezimalen) seit dem Es gibt in matplotlib auch epoch, das sind dann wieder Unix-Zeiten. Beispiel: Mehr Infos:

22 Formatieren von Datumsangaben
ctime() und isoformat() geben ein datetime Objekt im Format DOW MON DD hh:mm:ss YYYY bzw. YYYY-MM-DDThh:mm:ss aus (s.o.). Mit strftime(format) kann ein Datum in einem beliebigen Format ausgegeben werden. strptime(datestring, format) wandelt einen String in ein datetime Datumsobjekt um. Beispiele:

23 Formatieren von Datumsangaben
datetime.strftime und datetime.strptime Format Meaning Example %Y Year as 4-digit integer 2012 %y Year as 2-digit integer 12 %m Month as 2-digit integer 01 %B Full month name January %b Abbreviated month name Jan %d Day as 2-digit integer 04 %j Day of year as 3-digit int 278 %A Full weekday name Friday %a Abbreviated weekday name Fri %w Weekday (Sunday=0) 5 %U Week number (Sunday=0) 42 %W Week number (Monday=0) 41 Format Meaning Example %H Hour as 2-digit int (24 h) 23 %I Hour as 2-digit int (12 h) 11 %M Minute as 2-digit integer 01 %S Second as 2-digit integer 57 %p AM / PM PM %f Microseconds as 6-digit int 000000 %c = %m/%d/%y %H:%M:%S s.u. %x = %m/%d/%y 10/31/08 %X = %H:%M:%S 14:09:12 %z UTC offset %Z Time zone name %% A % character % Mehr Infos:

24 Kontrolle des Datumsformats beim Einlesen
from Converter dictionary: (Format)umwandlung für einzelne Spalten oder Variablen Beispiel:

25 Aufgaben Schreibe ein Programm, welches die täglichen Wetterdaten der Station Bonn-Endenich einliest und dabei das Datum in datetime Objekte umwandelt, die Temperaturen in K und die Windgeschwindigkeit in m/s. Die Datei heißt meteo_record_bonn-endenich_2012.csv (sie befindet sich auf ftp://sv02.meteo.uni-bonn.de/pub/maschu/python/data/ meteo_record_bonn-endenich_2012.csv . Lade die stündlich aufgelösten Ozon-Messdaten der GAW Station Barrow eines beliebigen Jahres aus dem World Data Center for Greenhouse Gases (http://ds.data.jma.go.jp) und lese sie ein. Ignoriere die Header-Informationen (32 Kommentarzeilen) Lese den Stationsnamen und die Angaben zu Latitude, Longitude und Altitude aus dem Header mit aus Wetterdaten:

26 Löschen/Umbenennen von Dateien
Die Module os und shutil enthalten praktisch alles, was man zum Umgang mit Dateien benötigt. Beispiele: Nicht ganz so trivial: Löschen von Dateien mit bestimmten Namensmustern (wildcards). Beispiel (Unix) rm ooops* funktioniert mit os.remove() nicht! Auch shutil.rmtree greift da nicht (zumindest, wenn andere Dateien erhalten bleiben sollen).

27 Arbeiten mit Verzeichnissen
Die glob() Funktion aus dem Modul glob wandelt wildcards in eine Liste von Dateien um. Beispiel: Damit können wir nun auch alle ooops* Dateien in einem Rutsch löschen: Beispiel: Verzeichnisse anlegen und (leere) Verzeichnisse löschen geht mit os.mkdir() bzw. os.rmdir(). Ganze Verzeichnisbäume können mit shutil.rmtree() entfernt werden. Rekursives Löschen kann ganz schön viel Arbeit verursachen!

28 Netcdf „Network Common Data Format“: Strukturierte Binärdaten mit Metadata-Attributen („selbsterklärend“) Entwickelt von Unidata (Boulder, CO): Referenz-API in C, APIs für diverse Programmiersprachen verfügbar Maschinen-unabhängiges Datenformat Netcdf Dateien enthalten: Variablen: Datenfelder mit Namen und Attributen Dimensionen: Integer-Werte, die die Variablengröße angeben Attribute: Metadaten-Informationen zu den Variablen … wir beschränken uns hier auf die „classic“ Varianten bis auf eine Kurzvorstellung des „Common Data Model“ Es gibt verschiedene netcdf Varianten. Gebräuchlich sind momentan: netcdf3 („classic“) netcdf4 („classic“) netcdf4/HDF5

29 Beispiel einer netcdf Datei
ncl Format (ncdump filename; ncgen filename):

30 Ein weiteres Beispiel (mehrdimensional)
ncl Format (ncdump filename; ncgen filename):

31 Python netcdf Bibliotheken
netCDF4: (netcdf3, 4, HDF5: read/write; Linux and Windows) PyNio: (netcdf 3, 4, HDF4: read/write; GRIB1, 2, HDF-EOS2, 5, shape: read; Linux only) SciPy.io.netcdf (in SciPy enthalten; netcdf 3) Empfohlen wird netCDF4, da es gut funktioniert, viele „Dialekte“ von netcdf unterstützt und aktiv weiterentwickelt wird.

32 Lesen von netcdf Dateien
Beispieldatei unter ftp://sv02.meteo.uni-bonn.de/pub/maschu/python/data/ MACC_ _0001.nc. Mehr Infos unter

33 Schreiben von netcdf Dateien
Geht auch ;-) Benutze dazu die create… Funktionen eines netcdf.Datasets. Mehr Infos unter

34 Datum in netcdf Dateien
Gemäß der netcdf-CF Konvention (siehe werden Datums- und Zeitangaben in netcdf Dateien meist relativ zu einem Referenzdatum angegeben. Dazu sind das units und das calendar Attribut erforderlich: Das netCDF4 Modul stellt die Routinen num2date() und date2num() zur Verfügung, um Zeitangaben einfach in datetime Objekte umzurechnen bzw. datetime Objekte in netcdf CF kompatible Zeitangaben zu übersetzen: Mehr Infos unter

35 Solutions to excercises
3. Let‘s take a look at the file format first: We have comma-separated values, variable names in the first row, and a date format that can be described as %Y-%m-%d. Die Meteo-Dateien von weather-underground enthalten noch html tags! Bearbeiten mit vi. Dabei entfernen von Zeilen, die nur ein <br> enthalten: :1,$ s/<br>\n// für Beispiel, evtl. zunächst Verzeichnis wechseln: import os os.chdir("C:/Users/m.schultz/Documents/Software/python/lecture") will already do most of what we need. However, as a print data.dtype will tell, the dates are stored as date objects (not datetime as we would like) and (of course) no conversions of temperatures or wind speeds took place.

36 3. continued Let‘s define the necessary conversion functions. Note that each function must take a string as argument and return the value in the appropriate data type. Next, we must map the variables onto the converter functions. csv2rec changes all variable names to lower case! The conversions will fail silently if we copy the variable names verbatim including the capitals! Die Meteo-Dateien von weather-underground enthalten noch html tags! Bearbeiten mit vi. Dabei entfernen von Zeilen, die nur ein <br> enthalten: :1,$ s/<br>\n// für Beispiel, evtl. zunächst Verzeichnis wechseln: import os os.chdir("C:/Users/m.schultz/Documents/Software/python/lecture")

37 3. continued Now, we can read the data easily (note that the default delimiter is ″,″): Inspection with print data.dtype and print data[0] should verify that everything works as it should. There is one minor thing left: the variable names are no longer correct, because we changes units. Let‘s rename them. We obtain the variable names as n=data.dtype.names. However, this is a tuple, and we cannot change inidividual tuple elements (tuples are „immutable“). Solution: convert to a list, change entries, and convert back: Die Meteo-Dateien von weather-underground enthalten noch html tags! Bearbeiten mit vi. Dabei entfernen von Zeilen, die nur ein <br> enthalten: :1,$ s/<br>\n// für Beispiel, evtl. zunächst Verzeichnis wechseln: import os os.chdir("C:/Users/m.schultz/Documents/Software/python/lecture") To convert all names, we make use of another dictionary…

38 3. continued Die Meteo-Dateien von weather-underground enthalten noch html tags! Bearbeiten mit vi. Dabei entfernen von Zeilen, die nur ein <br> enthalten: :1,$ s/<br>\n// für Beispiel, evtl. zunächst Verzeichnis wechseln: import os os.chdir("C:/Users/m.schultz/Documents/Software/python/lecture") Note the use of the dictionary‘s get method in the list comprehension. Since we don‘t rename every variable, the term varNameDict[entry] would cause an error for all items not defined. With get(element, default=None), we can specify a default value that shall be used in such cases. This default value is simply the unaltered entry! You can find the complete program as files_excercise3_csv2rec.py on ftp://sv02.meteo.uni-bonn.de/pub/maschu/python/programs.


Herunterladen ppt "Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 4: Dateien."

Ähnliche Präsentationen


Google-Anzeigen