Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Komunikacja człowiek - komputer 1 Wykład 3 Pliki i bazy danych w Pythonie Opracował: dr inż. Wojciech Bieniecki

Podobne prezentacje


Prezentacja na temat: "Komunikacja człowiek - komputer 1 Wykład 3 Pliki i bazy danych w Pythonie Opracował: dr inż. Wojciech Bieniecki"— Zapis prezentacji:

1 Komunikacja człowiek - komputer 1 Wykład 3 Pliki i bazy danych w Pythonie Opracował: dr inż. Wojciech Bieniecki Katedra Informatyki Stosowanej Politechnika Łódzka Literatura: Jakub Swacha – kurs Pythona Marcin Młotkowski – kurs języka Python Python documentation

2 2 Atrybuty: 'r' – do odczytu 'w' – do zapisu 'a' – do appendu 'r+' – do odczytu i zapisu 'rb', 'wb', 'ab' – odczyt i zapis binarny f.close() – zamyka plik Otwarcie i zamknięcie pliku: f = open('plik', 'r') Otwieranie plików

3 Atrybuty obiektu plikowego 3 closed określa czy plik jest zamknięty >>> f1.closed false Obiekty plikowe mają trzy podstawowe atrybuty: name zawiera nazwę pliku (tak jak podano ją przy otwarciu) >>> f1.name 'plik1.txt' mode określa tryb, w jakim otwarto plik >>> f1.mode 'w'

4 Błędy i wyjątki – otwarcie nieistniejącego pliku 4 >>> try:... fsock = open("c:/niemapliku.txt")... except IOError:... print "Plik nie istnieje"... print "Ta linia zawsze zostanie wypisana" Plik nie istnieje Ta linia zawsze zostanie wypisana >>> f = open("plik", "r") Traceback (most recent call last): File " ", line 1, in ? IOError: [Errno 2] No such file or directory: 'plik' Plik nie istnieje i dlatego zostanie rzucony wyjątek IOError. Ponieważ nie przechwytujemy tego wyjątku, Python po prostu wypisuje błąd i zakańcza działanie programu.

5 Czytanie pliku tekstowego 5 f.readlines() – zwraca listę wierszy f.read() – odczyt całego pliku f.read(l_zn) – odczyt tylko l_zn znaków. Zwracany jest string f.readline() – odczytuje jeden wiersz. Zwracamy razem ze znakiem "\n"

6 Obsługa błędów czytania 6 try: f = open(filename, "rb", 0) try: f.seek(-128, 2) tagdata = f.read(128) finally: f.close() except IOError: pass IOError może być rzucony przez: - open (plik może nie istnieć), - seek (plik może być mniejszy niż 128 bajtów) - read (być może dysk posiada uszkodzony sektor) kod z bloku finally zostanie zawsze wykonany, nawet jeśli jakaś instrukcja bloku try rzuci wyjątek. Pass jest wyrażeniem Pythona, które nic nie robi.

7 Przykłady czytania pliku 7 f = open('test.py', 'r') while True: wiersz = f.readline() if len(wiersz) == 0: break print wiersz, f.close() f = open('test.py', 'r') for wiersz in f: print wiersz, words = open("c:/730.txt").read().split() print words[:30] print words.count("Oliver") print words.count("Twist") print len(set(words))

8 8 f = open("Feel.mp3","rb") print f.tell() f.seek(-128, 2) print f.tell() tagData = f.read(128) print tagData print f.tell() read czyta określoną liczbę bajtów z otwartego pliku i zwraca dane w postaci łańcucha znaków, które zostały odczytane. Opcjonalny argument określa maksymalną liczbę bajtów do odczytu. Jeśli nie zostanie podany argument, read będzie czytał do końca pliku. tell zwraca aktualną pozycję w otwartym pliku. seek służy do poruszania się po otwartym pliku. Drugi argument: 0 – pozycja bezwzgledna, 1 – względem pozycji aktualnej 2 – względem końca Przykład: czytanie TAG z MP3

9 Zapis do pliku 9 Plik musi być otwarty w trybie do zapisu lub odczytu i zapisu 'w', 'a', 'r+' f.write(string) zapisuje zawartość łańcucha string ale nic nie zwraca >>> f.write('This is a test\n') Aby zapisać dane innego typu muszą być skonwertowane na string value = ('the answer', 42) s = str(value) f.write(s) f = ('/tmp/workfile', 'r+') f.write(' abcdef') f.seek(5) print f.read(1) #wypisze 5 f.seek(-3, 2) #3 bajt przed końcem f.read(1) #wypisze d

10 10 n=raw_input("Podaj pełną nazwę pliku do skopiowania>") oryg = file(n,"rb") kop = file("kopia "+n,"wb")# otwieramy kopię do zapisu while True: b = oryg.read(1) # wczytujemy 1 bajt z oryginału if not b: break # Koniec pliku! kop.write(b) kop.close() oryg.close() print "Kopiowanie zakończone pomyślnie" Kopiowanie pliku

11 11 t=raw_input("Podaj pełną nazwę pliku >") p=input("Podaj przesunięcie >) f1 = open(t,"r+b") s=f1.read() sz="" # sz oznacza tekst zaszyfrowany for c in s: a=ord(c) # wyliczamy kod ASCII if a > 32: # znaków białych i sterujących nie szyfrujemy c=chr((a+p) % 256) # inne przesuwamy sz+=c # dodajemy do sz f1.seek(0) # ustawiamy pozycję pliku na jego początku f1.write(sz) # zapisujmy sz f1.close() # zamykamy plik Kodowanie pliku

12 Zapisywanie całych wierszy 12 lista = ["napis1", "napis 2", "napis 3"] g=open("test.txt","w") g.writelines(lista) #zapisuje do pliku listę, oddziela znakiem " " g.close() f.writelines(['to\n', 'są\n', 'kolejne\n', 'wiersze\n'])

13 13 Pliki i struktury: MP3 TAG

14 Obsługa pliku *.ini 14

15 Obsługa pliku *.ini 15 import ConfigParser import sys config = ConfigParser.ConfigParser() config.add_section("book") config.set("book", "title", "the python standard library") config.set("book", "author", "fredrik lundh") config.add_section("ematter") config.set("ematter", "pages", 250) config.write(sys.stdout) [book] title = the python standard library author = fredrik lundh [ematter] pages = 250

16 Obsługa pliku *.ini – zmiany 16 Usuwanie: ini.remove_option('window', 'height') ini.remove_section('window') Modyfikacja parametrów: ini.set('window', 'height', 100) Zapis konfiguracji f = open('konfig.ini', 'w') ini.write(f) fh.close()

17 Obsługa plików CSV 17 CSV – Comma Separated Values Dane "Anna", "Kowalska", , 3 "Jan", "Nowak", , 2 Notowania giełdowe ; ;183.29;102.14; ; ;183.43;102.31; Parametry formatu: delimiter – separator, np. ',' ';' ': lineterminator – koniec wiersza quotechar – znak cudzysłowu quoting – kiedy ujmować pola w cudzysłów:QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE

18 Odczyt i zapis pliku CSV 18 import csv reader = csv.reader(open('/etc/passwd', 'r'), delimiter=':', quoting=csv.QUOTE_NONE) for row in reader: print row import csv data = [ [1, 'Kubus'], [2, 'Puchatek'] ] writer = csv.writer( open('out', "w"), dialect=csv.excel) writer.writerows(data)

19 CSV - Wykorzystanie słowników 19 fh = open('notowania.csv', "r") reader = csv.DictReader(fh, delimiter=';') for row in reader: for k in row.keys(): print k, row[k] fh = open('notowania.csv', "r") klucze = ['lp', 'name'] reader = csv.DictReader(fh, fieldnames= klucze) for row in reader: print row['lp'], row['name'] Własne klucze:

20 20 Rekord Indeks(int)Imię (char[20] Nazwisko (char[30]) Ocena (float)Semestr(byte)Grupa(char[5]) Rekord Plik Pliki rekordowe

21 21 f=open("studenci","wb") imie="Jan" nazwisko="Kowalski" indeks=70678 ocena=4.5 semestr=3 grupa="3D20" import struct rekord=struct.pack("

22 Struct – znaczenie symboli 22 Format Typ języka C Python xpad bytebrak wartości ccharnapis o długości 1 bsigned charinteger Bunsigned charinteger hshortinteger Hunsigned shortinteger iintinteger Iunsigned intlong l integer Lunsigned longlong q Qunsigned long longlong ffloat ddoublefloat schar[]string pchar[]string Pvoid *integer

23 Znaczenie pierwszego znaku 23 Znak Porządek bajtów Rozmiar i odpowiedni dla maszyny = standardowy big-endianstandardowy ! sieciowy (= big- endian) standardowy Jeśli pierwszym znakiem napisu nie jest żaden z powyższych, przyjmuje się interpretację odpowiadającą znakowi ". Porządkiem bajtów odpowiednim dla maszyny może być zarówno big-endian jak i little- endian, w zależności od systemu, na którym wykonywany jest program. Przykładowo, procesory firm Motorola oraz Sun używają porządku bajtów big-endian; procesory firm Intel oraz DEC używają little-endian.

24 Odczyt pliku rekordowego 24 g=open("studenci","rb") sr=struct.calcsize("

25 25 Serializacja obiektu polega na przekształceniu danych go opisujących w ciąg bajtów (funkcja dumps), z którego można później odtworzyć taki sam obiekt (funkcja loads). Serializacja obiektów

26 Serializacja własnych obiektów 26 class wymiary3: x=0; y=0; z=0 w3=wymiary3() w3.x=1; w3.y=2; w3.z=3 zapis=pickle.dumps(w3) del w3 w3=pickle.loads(zapis) print w3.x; w3.y; w3.z Dzięki pickle można serializować obiekty należące do klas zdefiniowanych przez nas.

27 Zapis bezpośrednio do pliku 27 f1=file("trzy_rzeczy.txt","w+") pickle.dump((lista,slownik,w3),f1) lista=[]; slownik={}; w3=wymiary3() print lista; slownik; w3.x [] {} 0 f1.seek(0) (lista,slownik,w3)=pickle.load(f1) print lista; slownik; w3.x [1, 2, 'trzy', 4] {'a': 'b', 1: 2} 1

28 Moduł dumbdbm 28 Moduł tworzy słownik zapisany na dysku. Składa się on z dwóch plików.dat i indeksującego.dir). Obsługa bazy jest identyczna jak obsługa słownika, z tą różnicą, że wszystkie zachowane w niej dane przechowywane są nie w pamięci, lecz na dysku. import dumbdbm db=dumbdbm.open("prosta_baza") db['napis']="hej ho!" print db['napis'] db.close() Bazy danych typu dbm pozwalają używać napisów jako kluczy i wartości. Próba zachowania w niej obiektu innego niż napis typu, nieuchronnie kończy się błędem

29 Moduł shelve 29 analogiczny sposób dostępu do danych (podobny słownikowi), umożliwiając jednak zachowywanie obiektów dowolnego typu (nie tylko napisów) import shelve lista = [1, 2, "trzy", 4] slownik={"a":"b",1:2} db = shelve.open ('baza') db['lista']=lista db['slownik']=slownik

30 Moduł shelve - możliwości 30 liczba elementów: >>> len(db) 2 Sprawdzenie istnienia klucza: >>> 'lista' in db True Lista kluczy: >>> db.keys() ['lista', 'slownik']

31 Moduł shelve - możliwości 31 Wyszukanie wartości po kluczu >>> db['lista'] [1, 2, 'trzy', 4] >>> db['slownik'] {'a': 'b', 1: 2} Lista wartości: >>> db.values() [[1, 2, 'trzy', 4], {'a': 'b', 1: 2}] Lista elementów: >>> db.items() [('lista', [1, 2, 'trzy', 4]), ('slownik', {'a': 'b', 1: 2})]

32 Moduł shelve - możliwości 32 Modyfikacja wartości: >>> db['lista']=[3,2] Usunięcie elementu: >>> del db['lista'] >>> db.items() [('slownik', {'a': 'b', 1: 2})] Usunięcie wszystkich elementów: >>> db.clear() >>> db.items() [] Zamknięcie bazy >>> db.close()

33 Baza danych SQLite 33 Możliwe jest tworzenie wstępnej wersji aplikacji z wykorzystaniem SQLite, a następnie przeniesienie jej na standardowy serwer bazy danych (PostgreSQL czy Oracle) SQLite to biblioteka napisana w języku C Obsługuje "lekką" bazę danych w postaci jednego pliku na dysku. Nie wymaga instalacji serwera ani łączenia się z serwerem. Używa odmiany języka SQL Może być używana jako struktura danych skojarzona z aplikacją Implementuje DB API 2.0 z rozszerzeniami

34 Proste operacje na bazie 34 import sqlite3 db = sqlite3.connect('temp.db') kursor = db.cursor() kursor.execute("create table Student(nazwisko text, imie text, indeks int, ocena real)") db.commit() kursor.execute("insert into Student values('Kowalski', 'Jan', 70660, 4.5)") kursor.execute('SELECT * FROM Student') for row in kursor: print row kursor.close()

35 Zapytanie sparametryzowane 35 # NIE! – niebezpieczne nazwisko = 'Kowalski' kursor.execute("select * from Student where nazwisko = '%s' " % nazwisko) Czasem zapytanie będzie wykorzystywać zmienne z programu. Sklejanie zapytania poprzez użycie operacji na stringach w Pythonie może być niebezpieczne (narażenie na atak Injection). W zamian należy użyć symbol zastępczy. # TAK! t = (nazwisko,) kursor.execute('select * from Student where nazwisko=?', t) # Bardziej złożony przykład for t in [('Kowalski', 'Jan', 70123, 4.5), ('Wisniewski', 'Maciej', , 3.5), ('Nowak', 'Grzegorz', , 3), ]: kursor.execute('insert into Studencivalues (?,?,?,?)', t)

36 SQLite w pamięci i generatory 36 import sqlite3 def char_generator(): import string for c in string.letters[:26]: yield (c,) con = sqlite3.connect(":memory:") cur = con.cursor() cur.execute("create table characters(c)") cur.executemany("insert into characters(c) values (?)", char_generator()) cur.execute("select c from characters") print cur.fetchall()

37 Prawdziwe bazy danych 37 Python obsługuje różne serwery relacyjnych baz danych między innymi: Oracle DB/2 MySQL PostgreSQL MS SQL Python Database API Specification Zunifikowany interfejs (metody i pola) dostępu do różnych silników relacyjnych baz danych (Aktualna wersja: 2.0)

38 Korzystanie z MySQL 38 import MySQLdb db = MySQLdb.connect(host='localhost', db='studenci', user='root', passwd='root') wynik = db.cursor() wynik.execute('SELECT * FROM Student') row = wynik.fetchone() while row: print row row = wynik.fetchone() wynik.close() db.close()


Pobierz ppt "Komunikacja człowiek - komputer 1 Wykład 3 Pliki i bazy danych w Pythonie Opracował: dr inż. Wojciech Bieniecki"

Podobne prezentacje


Reklamy Google