JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA Marcin Lewandowski [ mlew@ippt.gov.pl ]
PLIKI, DANE, FORMATY, KONWERSJE 2
Moduły do obsługi plików sys, os, os.path podstawowe funkcje plikowe fileinput otwiera i czyta pliki podane w linii poleceń, czyli sys.argv[1:]; domyślnie sys.stdin import fileinput for line in fileinput.input(): process(line) tempfile do tworzenia tymczasowych plików i katalogów shutil wysokopoziomowe operacja na plikach (np. copytree, rmtree) glob, fnmatch wyszukiwanie i dopasowywanie nazw plików na podstawie wyrażeń regularnych Patrz dokumentacja PYTHON i slajdy z zeszłego semestru 3
Moduł os standardowe wej./wyj. sys.stdin obiekt plikowy: standardowe wejście; domyślnie podłączony do konsoli (używany np. przez raw_input()). Dostępny także przez sys.stdin.read() oraz inne standardowe funkcje plikowe. sys.stdout obiekt plikowy: standardowe wyjście; domyślnie podłączony do konsoli (używany np. przez print). Dostępny także przez sys.stdout.write() oraz inne standardowe funkcje plikowe. sys.stderr obiekt plikowy: standardowe wyjście błędów; domyślnie podłączony do konsoli (używany np. przez print). Dostępny także przez sys.stderr.write() oraz inne standardowe funkcje plikowe. 4
Moduł os os.stat() os.stat() zwraca informację o pliku w formie listy: st_mode (protection bits), st_ino (inode number), st_dev (device), st_nlink (number of hard links), st_uid (user id of owner), st_gid (group id of owner), st_size (size of file, in bytes), st_atime (time of most recent access), st_mtime (time of most recent content modification), st_ctime (platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows) >>> import os >>> statinfo = os.stat('somefile.txt') >>> statinfo (33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732) >>> statinfo.st_size 926L 5
Moduł os, os.stat os.stat zawiera stałe i funkcje do interpretacji informacji z funkcji: os.stat(), os.fstat(), os.lstat() import os, sys from stat import * top = r. for f in os.listdir(top): pathname = os.path.join(top, f) file_stat = os.stat(pathname) if S_ISDIR(file_stat[ST_MODE]): print pathname, is a directory elif S_ISREG(file_stat[ST_MODE]): print pathname, is a file of size, file_stat[st_size] else: # Unknown file type print 'Skipping %s' % pathname 6
Moduł tempfile TemporaryFile(mode= w+b, bufsize=-1, suffix=, prefix= tmp, dir=none) tworzy plik tymczasowy, który jest automatycznie kasowany przy zamknięciu NamedTemporaryFile(mode= w+b, bufsize=-1, suffix=, prefix= tmp, dir=none, delete=true) j.w. ale z opcją wyłączenia kasowania pliku oraz zapewnioną widocznością pliku w systemie plików (fd, name) = mkstemp(suffix=, prefix= tmp, dir=none, text=false) tworzy plik tymczasowy. Kasowanie pliku wymaga użycia os.remove() import tempfile, os fd, tempname = tempfile.mkstemp('.dat') temp = open( tempname, 'w+' ) # Some Processing... 7
Moduł shutil shutil ułatwia kopiowanie i usuwanie całych katalogów: copy(source, destination) kopiuje pliki i/lub katalogi (odpowiednik komendy UNIX cp src dst ) copyfile(source, destination) j.w. ale kopiuje tylko pliki copytree(source, destination) rekursywnie kopiuje całe poddrzewo katalogów; destination nie może istnieć! rmtree(path) usuwa drzewo katalogów poniżej path 8
Moduł glob UNIX powłoka (shell) robi to automatycznie; Windows NIE! Globbing plików z linii poleceń: # python script.py *.txt *.csv import glob, sys for arg in sys.argv[1:]: for f in glob.glob(arg): process( f ) 9
Moduł fnmatch Dopasowywanie nazw plików wg. reguł UNIX: import fnmatch >>> fnmatch.fnmatch('greppy.py','*.py') True >>> fnmatch.fnmatch('readme','*.py') False 10
Moduły do obsługi plików skompresowanych tarfile, zipfile obsługa (odczyt/zapis) plików archiwów w formatach TAR (.tar,.tgz,.tar.gz) i ZIP zlib, bz2, gzip moduły do obsługi bezstratnej kompresji/dekompresji plików i danych Moduł gzip ma prosty interfejs i działa tylko na całych plikach 11
Moduł zipfile Pełna obsługa struktury plików ZIP # Creates ZIP file form *.xml in given directory import zipfile, os, fnmatch path = r'.' zf = zipfile.zipfile('book.zip', 'w', zipfile.zip_deflated) for nm in os.listdir(path): if fnmatch.fnmatch(nm,'*.xml'): zf.close() full = os.path.join(path, nm) zf.write(full) Patrz dokumentacja PYTHON 12
EX ZIP wybranych plików ZIP plików z wybranych katalogów na podstawie ich specyfikacji w linii poleceń 13
Moduły do serializacji/persystencji obiektów pickle, shelve modułu pozwalają na zachowywanie i odtwarzanie obiektów Pythona do/z plików (tzw. persystencja obiektów) lub buforów danych (tzw. serializacja). pickle używa reprezentacji tekstowej (ASCII) shelve używa formatu bazy danych dbm Obiekty, które poddają się pickle: None, True, False Zmienne typów prostych (całkowitoliczbowe, zmiennoprzecinkowe, zespolone) Stringi ASCII i Unicode Listy, listy niemodyfikowalne, słowniki, zbiory, zawierające tylko obiekty pickl owalne Funkcje zdefiniowane na najwyższym poziomie modułu Klasy zdefiniowane na najwyższym poziomie modułu Instancje takich klas, których dict lub setstate () są pickl owalne 14
pickle >>> import cpickle as pickle >>> t1 = ('this is a string', 42, [1, 2, 3], None) >>> p1 = pickle.dumps(t1) >>> p1 "(S'this is a string'\ni42\n(lp1\ni1\nai2\nai3\nantp2\n." >>> t2 = pickle.loads(p1) >>> t2 ('this is a string', 42, [1, 2, 3], None) >>> p2 = pickle.dumps(t1, True) 15
Moduły do obsługi formatów MIME email obsługa plików załączników email w formacie MIME mailbox obsługa skrzynki pocztowej typu Mailbox w różnych formatach mimetypes obsługa typów MIME oraz mapowania na rozszerzenia plików binascii moduł do konwersji pomiędzy różnymi reprezentacjami danych binarnymi/tekstowymi (uu, base64, binhex) base64 enkoder/dekoder dla MIME Base16, Base32, Base64 binhex enkoder/dekoder dla binhex4 uu enkoder/dekoder dla uuencode quopri enkoder/dekoder danych w formacie MIME quoted-printable 16
Moduły do baz danych anydbm (dbm w Python 3+) generyczny moduł obsługi baz danych z interfejsem dbm: dbhash interfejs do baz Berkeley DB dumbdbm przenośna implementacja interfejsu dbm gdbm interfejs do baz dbm GNU DB-API 2.0 specyfikacja interfejsu Pythona do baz danych (http://www.python.org/dev/peps/pep-0249); sterowniki do baz danych: ODBC, ADO, IBM DB2, Firebird, Informix, Ingres, MySQL, Oracle, PostgreSQL, SAP DB, MS SQL Server, Sybase sqlite3 funkcjonalność bazy danych SQLite 17
Bazy danych typy Relacyjne (RDBMS) Obiektowe Kartotekowe (ISAM Indexed Sequential Access Method) DB-style 18
Pojęcia baz danych Baza danych to zbiór danych zapisanych w ściśle określony sposób w strukturach odpowiadających założonemu modelowi danych (potocznie: dane + system zarządzania/oprogramowanie) Model danych to zestaw zasad/reguł wg. których opisywane/pamiętane są dane Schema to opis/struktura opisująca konkretną kolekcję danych przy pomocy danego modelu danych Relacyjny model danych a obecnie najpowszechniejszy: Relacja: powiązanie pomiędzy tabelami; tabele z wierszami (rekordami), rekordy z polami Każda relacja posiada schema, która opisuje strukturę tabel i zależności 19
DBMS Data Base Management Systems System Bazy danych Aplikacja DBMS Aplikacja Aplikacja Schemat Baza danych 20
Transakcje ACID Transakcja sekwencja operacji na bazie danych: odczyt/modyfikacja/zapis Właściwość ACID transakcji: Atomicity atomowość operacji (tzw. wszystkoalbo-nic); Consistent spójność stanu bazy danych Isolation izolacja równolegle zleconych transakcji Durability trwałość rezultatu transakcji (nawet w wypadku padu DBMS) 21
SQL Structured Query Language DDL: Data Definition Language Używany do tworzenia i zarządzania strukturami bazy danych (tabele) DCL: Data Control Language Używany do określania praw dostępu DML: Data Manipulation Language Używany do dostępu do danych do bazy danych 22
SQL c.d. DDL: Data Definition Language CREATE TABLE employee (id serial NOT NULL, name varchar(50), address varchar(50), CONSTRAINT id" PRIMARY KEY (id)); DCL: Data Control Language GRANT SELECT, UPDATE (name, address) ON employee TO steve DML: Data Manipulation Language SELECT name, address FROM employee ORDER BY name 23
anydbm import anydbm # Open database, creating it if necessary db = anydbm.open('cache', 'c') # Record some values db['www.python.org'] = 'Python Website' db['www.cnn.com'] = 'Cable News Network' # Loop through contents. # Other dict methods:.keys(),.values() also work for k, v in db.iteritems(): print k, '\t', v db.close() # Close when done 24
SQLite http://www.sqlite.org Zero confguration nie wymaga administratora Przenośność: Windows, Linux, OS X, Solaris, HPUX, AIX; architektury 16, 32, 64-bit Kompaktowa małe wymagania pamięciowe W formie biblioteki (nie posiada procesu serwera) Open source (GPL) Ograniczenia: lokalna brak dostępu sieciowego jeden zapis w jednym czasie 25
EX Import danych z CSV do SQLite3 DB SQL Wczytać przykładowy plik CSV o nazwie data.csv Utworzyć bazę i załadować do niej dane 26
Moduły do obsługi wybranych formatów csv obsługa plików w formacie CSV (wbudowany) h5py obsługa plików w formacie HDF5 (http://h5py.googlecode.com) 27
Pliki CSV moduł CSV csv.reader(csvfile[, dialect='excel'][, fmtparam]) zwraca obiekt typu reader dla pliku CSV. import csv cr = csv.reader(open('plik.csv'), delimiter=',', quotechar= ') for row in cr: print ':'.join(row) 28
CSV z obsługą błędów import csv, sys fn = "some.csv" reader = csv.reader(open(fn, "rb")) try: for row in reader: print row except csv.error, e: sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e)) 29
EX1 Odczyt pliku CSV Używając modułu CSV: Wczytać przykładowy plik CSV o nazwie test.csv Wyświetlić wszystkie elementy wiersz-po-wierszu i kolumna-po-kolumnie z informacją z nagłówka 30
EX2 Konwersja separatorów Używając modułu CSV: Wczytać przykładowy plik CSV o nazwie test.csv Przekonwertować separatory na \t (tab) Zapisać rezultat do pliku ttest.csv 31
HDF5 Hierarchical Data Format (HDF, HDF4, HDF5 ) określa format oraz zestaw bibliotek do zachowywania i manipulowania BARDZO DUŻYMI zestawami danych numerycznych Oryginalnie opracowany w National Center for Supercomputing Applications, obecnie rozwijany i wspierany przez organizację non-profit The HDF Group (http://www.hdfgroup.com) OTWARTY!!! 32
HDF5 cechy Uniwersalny i hierarchiczny model danych pozwala na reprezentację złożonych struktur danych oraz metadanych (a la system plikowy w pliku) W pełni przenośny pomiędzy różnymi platformami Obsługa plików > 2GB OFICJALNE biblioteki dla: C, C++, Fortran 90, Java INNE biblioteki: Matlab (7+), Perl, Python Dostępne narzędzia do zarządzania, przeglądania, analizy i manipulacji 33
HDF5 struktura HDF5 jest hierarchiczny struktury: Groups & Datasets Dodatkowo Attributes mogą być przypisane do danego Dataset HDF5 Groups zawierają: Strukturę grupującą 0 lub więcej Groups lub Datasets Dodatkowe metadane HDF5 Datasets zawiera: Nagłówek danych Tablicę danych 34
Structures to organize objects Groups / (root) 3-D array /foo palette lat lon temp ---- ----- ----- 12 23 3.1 15 24 4.2 17 21 3.6 Table Raster image Datasets Raster image 2-D array 35
HDF5 Dataset Klasy informacji w nagłówku Dataset: Nazwa Datasetu string ASCII Typ danych: Atomowe np. integer, float Złożone struktury Przestrzeń danych określa liczbę wymiarów Datasetu (nielimitowana) Układ Datasetu: Ciągły (domyślny) Blokowy w równych kawałkach zapamiętywanych w różnych częściach pliku (w celu optymalizacji I/O) 36
HDF5 Dataset Rank 3 Metadata Dataspace Dimensions Dim_1 = 4 Dim_2 = 5 Dim_3 = 7 Data Datatype Integer Properties Chunked Compressed (optional) Attributes Time = 32.4 Pressure = 987 Temp = 56 Na podstawie:introduction to HDF5 by Barbara Jones, The HDF Group, The 13th HDF & HDF-EOS Workshop, November 3-5, 2009 37
HDF5 typy danych 38
HDF5 Attributes Attributes małe nazwane Datasety związane z głównymi Datasets, Groups lub nazwanymi typami danych Używane do opisu danych (metadane) Attribute składają się z: Nazwy Wartości Attributes są pamiętane w nagłówkach obiektów, których dotyczą 39
HDFView przeglądarka HDF5 40
HDF5 i Matlab Domyślny format plików MAT od wersji 7.3+ Funkcje wysokiego poziomu zapis/odczyt plików MAT (workspace) Funkcje niskiego poziomu (300 funkcji) bezpośredni dostęp do biblioteki C API Patrz: MATLABR 7 Programming Fundamentals 41
HDF5-Matlab funkcje wysokiego poziomu hdf5info hdf5read hdf5write 42
hdf5info fileinfo = hdf5info(filename) fileinfo = hdf5info(...,'readattributes',bool) [...] = hdf5info(..., 'V71Dimensions', BOOL) Przykład: fileinfo = hdf5info('example.h5') fileinfo = Filename: 'example.h5' LibVersion: '1.8.3' Offset: 0 FileSize: 8172 GroupHierarchy: [1x1 struct] 43
hdf5read data = hdf5read(filename,datasetname) attr = hdf5read(filename,attributename) [data, attr] = hdf5read(...,'readattributes',bool) data = hdf5read(hinfo) [...] = hdf5read(..., 'V71Dimensions', BOOL) 44
HDF5 i Python h5py (http://h5py.googlecode.com) NumPy (http://new.scipy.org) Test: >>> import h5py.tests >>> h5py.tests.runtests() 45
EX: hdf5 Konwersja pliku tekstowego do HDF5 Skrypt T2Hconverter.py służy do konwersji pliku tekstowego (TXT), z danymi przykładowymi, do formatu HDF5 Jako wynik otrzymujemy plik HDF5 (H5) o nazwie identycznej z nazwą pliku danych T2Hconverter [nazwa pliku danych] 46
Tekstowe dane wejściowe ------- listing pliku dane.txt ----------------------------------------------- ; Przykładowy plik z danymi pomiarowymi. ; Średnik na początku linii oznacza komentarz ; Format danych: ; Czas [s] (float), Temperatura [st. C] (float) 0,25.6 5,27.3 10,29.1 15,30.7 20,31.2 25,34.5 30,42.2 35,37.5 40,32.0 45,27.6 50,25.3 55,25.1 60,25.0 -------- koniec listingu ------------------------------------------------------ 47
Struktura pliku wynikowego HDF5 /ROOT ----Header - ConversionDate (string) data i czas konwersji - Description (string) opis pliku - ScriptVersion (pomnożona x10) (int) wersja skryptu zapisu ----Data - Values (float) macierz danych ( rząd 1 - czas, rząd 2 - temp ) 48
Skrypty dla Matlaba Skrypt "h5reader_example.m" odczytuje dane z pliku wejściowego w formacie HDF5 i wyświetla zawartość w oknie roboczym. Nazwa pliku wejściowego znajduję się w zmiennej FILE_NAME deklarowanej na początku skryptu 49