JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA Marcin Lewandowski [ [email protected] ] 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'): full = os.path.join(path, nm) zf.write(full) zf.close() 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 Aplikacja System Bazy danych 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” lat | lon | temp ----|-----|----12 | 23 | 3.1 15 | 24 | 4.2 17 | 21 | 3.6 palette Table Raster image Raster image “Datasets” 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 Metadata Data Dataspace Rank Dimensions 3 Datatype Dim_1 = 4 Dim_2 = 5 Dim_3 = 7 Integer (optional) Attributes Properties Time = 32.4 Chunked Pressure = 987 Compressed 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 | | | |- Description | | | |- ScriptVersion (pomnożona x10) | |----Data | | | |- Values (float) czas, rząd 2 - temp ) (string) data i czas konwersji (string) opis pliku (int) wersja skryptu zapisu macierz danych ( rząd 1 - 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