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

Slides:



Advertisements
Ähnliche Präsentationen
Relative Clauses.
Advertisements

DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Die Schulregeln (the school rules) Kein Graffiti in der Schule!
10. Grundlagen imperativer Programmiersprachen
Verbs Used Impersonally With Dative Deutsch I/II Fr. Spampinato.
10 Streams JavaHS Merseburg WS 05/06 E/A - Ströme (Streams) in Java.
Java: Dynamische Datentypen
Dateihandles Um in Perl eine bestimmte Datei zum Lesen, Schreiben oder Anhängen zu öffnen, benötigt man so genannte Dateihandles. Ein Dateihandle ist der.
XINDICE The Apache XML Project Name: Jacqueline Langhorst
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Die Skriptsprache Perl (8) Wolfgang Friebel DESY Zeuthen.
Programmierung 1 - Repetitorium
Einführung in die Programmierung Datensammlung
DBD::PO Mit SQL GNU gettext PO-Files bearbeiten. Über was ich heute spreche. Vom Quelltext bis zur mehrsprachigen Anwendung. Formate Irrwege Lösungen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Aufwaermung Was ist dein Lieblingsbuch? Was ist dein Lieblingsfilm?
1000 Km bis zum Meer. “1000 Km to the sea” Luxuslärm
Durch die Nacht “through the night” Silbermond
Don`t make me think! A Common Sense Approach to Web Usability
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
You need to use your mouse to see this presentation © Heidi Behrens.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
You need to use your mouse to see this presentation © Heidi Behrens.
Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 3: Numpy.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
You need to use your mouse to see this presentation © Heidi Behrens.
You need to use your mouse to see this presentation © Heidi Behrens.
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
HORIZONT 1 XINFO ® Das IT - Informationssystem Assembler HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 /
Dynamische Datentypen
PHP Basic.
Clean Code Software-Entwicklung als Handwerkskunst Thomas Nagel, November 2011.
Deutsch Eins
Einführung in PHP.
Die Olympischen Sommerspiele 2012 (offiziell Spiele der XXX. Olympiade genannt) sollen vom 27. Juli bis 12. August 2012 in London stattfinden. London ist.
DATEISPEICHER in der S P S
1 Tagesüberblick 2 Lösung Hausaufgabe/Fragen Datei- ein- und ausgabe Schleifen Vergleiche Wahrheit.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
1 Tagesüberblick 4 Lösung Hausaufgabe/Fragen Mustervergleiche.
1 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt Modalverben.
Der formelle Imperativ – the Imperative
Numbers Greetings and Good-byes All about Me Verbs and Pronouns
Erstellen einer Arff-Datei
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Einfaches Erstellen von Präsentationen aus Einzelfolien heraus.
Kapitel 4 Alles für die Schule Lernziel: Formation of Plural.
Die Fragen Wörter Wer? Was? Wann?.
Name: ___________________________________________ Hör verstehen: (______/10) Mark whether you hear a “du”, an “ihr” or a “Sie” command Wer sagt.
The Journey to America… The Immigrant Experience.
COMMANDS imperative There are three command forms: formal familiar singular familiar plural.
COMMANDS imperative 1. you (formal): Sie 2. you (familiar plural): ihr
Gregor Graf Oracle Portal (Part of the Oracle Application Server 9i) Gregor Graf (2001,2002)
Kapitel 4: Mein Tag Sprache.
Kapitel 2 Grammar INDEX 1.Subjects & Verbs 2.Conjugation of Verbs 3.Subject Verb Agreement 4.Person and Number 5.Present Tense 6.Word Order: Position of.
On the case of German has 4 cases NOMINATIVE ACCUSATIVE GENITIVE DATIVE.
LLP DE-COMENIUS-CMP Dieses Projekt wurde mit Unterstützung der Europäischen Kommission finanziert. Die Verantwortung für den Inhalt dieser.
Interrogatives and Verbs
Englisch Grundlagen, Modal Verbs
You need to use your mouse to see this presentation
THE PAST TENSE (Part 3) VERBS WHICH TAKE SEIN
School supplies.
- moodle – a internet based learning platform
 Präsentation transkript:

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

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: http://www.tutorialspoint.com/python/python_files_io.htm

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.

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

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: http://effbot.org/zone/python-with-statement.htm

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

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

Lesen/Schreiben von Binärdaten (1): tofile und fromfile test2 wird nur die Größe 10000 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″.

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.

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)

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

einfachere Handhabung Excel-Dateien 1. Excel Spreadsheets (.xls): xlrd, xlwt, xlutils modules  http://www.python-excel.org/ 2. CSV files (.csv): csv.reader  http://www.doughellmann.com/PyMOTW/csv/ numpy.loadtext() numpy.genfromtext() matplotlib.mlab.csv2rec() einfachere Handhabung

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.

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:

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

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 (734796.52083333 etc.) data3: dto. data4: strings (S16), keine Umwandlung

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

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

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 1.1.1 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:

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?

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

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:

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: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

Kontrolle des Datumsformats beim Einlesen from http://matplotlib.org/api/mlab_api.html#matplotlib.mlab.csv2rec: Converter dictionary: (Format)umwandlung für einzelne Spalten oder Variablen Beispiel:

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: http://wuhelp.wunderground.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=73

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).

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!

Netcdf „Network Common Data Format“: Strukturierte Binärdaten mit Metadata-Attributen („selbsterklärend“) Entwickelt von Unidata (Boulder, CO): http://www.unidata.ucar.edu/software/netcdf/ 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

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

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

Python netcdf Bibliotheken netCDF4: http://code.google.com/p/netcdf4-python/ (netcdf3, 4, HDF5: read/write; Linux and Windows) PyNio: http://www.pyngl.ucar.edu/Download/ (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.

Lesen von netcdf Dateien Beispieldatei unter ftp://sv02.meteo.uni-bonn.de/pub/maschu/python/data/ MACC_20121027_0001.nc. Mehr Infos unter http://netcdf4-python.googlecode.com/svn/trunk/docs/netCDF4-module.html.

Schreiben von netcdf Dateien Geht auch ;-) Benutze dazu die create… Funktionen eines netcdf.Datasets. Mehr Infos unter http://netcdf4-python.googlecode.com/svn/trunk/docs/netCDF4-module.html.

Datum in netcdf Dateien Gemäß der netcdf-CF Konvention (siehe http://cf-pcmdi.llnl.gov) 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 http://netcdf4-python.googlecode.com/svn/trunk/docs/netCDF4-module.html.

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.

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") …

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…

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.