Informatyka 2015/16 wykład 9 Pliki Sterowanie przebiegiem programu cz. 2 Dr inż. Witold Nocoń (p. 230)
Pliki Pliki dzielą się na dwa rodzaje: Pliki tekstowe (zawartość pliku jest typu string) Pliki binarne (zawartość pliku jest typu byte string nie są interpretowane żadne znaki np. \n. Plik zawiera surowe bajty (po 8 bitów)), np.: pickle, shelve Pliki graficzne itp.
Pliki Otwieranie plików, np.: mojplik = open(r'e:/nowy.txt','w') Obiekt pliku Ścieżka do pliku Tryb otwarcia Tekst ścieżki powinien być oznaczony jako raw string aby znaki ucieczki (np. \n) nie były interpretowane Podanie tylko nazwy pliku tworzy go w tym katalogu w którym jest zapisany skrypt
Pliki Tryby otwarcia pliku: w plik otwarty do zapisu (tworzony jest nowy plik, a stary (jeśli istniał) jest nadpisywany r plik otwarty do czytania a plik otwierany do zapisu bez kasowania (zapis nowych danych na koniec pliku) + - otwarcie zarówno do czytania jak i pisania: r+ - otwarcie istniejącego pliku z możliwością zapisu i odczytu w+ - otwarcie nowego pliku z możliwością zapisu i odczytu Dodatkowo: b otwarcie pliku w trybie binarnym
Pliki Zapis do pliku: mojplik.write( Tekst do zapisu\n ) Koniec linii nie jest automatycznie dodawany mojplik.writelines([ tekst1, tekst2 ])
Pliki Czytanie z pliku: s=mojplik.read() czyta cały plik s=mojplik.read(n) czyta N bajtów s=mojplik.readline() czyta do znaku \n s=mojplik.readlines() czyta cały plik i zwraca listę wierszy
Pliki Zamykanie plików: mojplik.close() W zasadzie zamykanie plików nie jest wymagany, gdyż obiekt pliku zostaje usunięty (a plik zamknięty) jeśli nie ma do niego referencji, ale należy zamykać pliki ręcznie wywołując metodą close() W innych językach może tak nie być, a niezamknięcie pliku może skutkować utrata danych Przyszłe/Inne implementacje Pythona mogą zachowywać się inaczej pod tym względem
Pliki Inne metody/atrybuty obiektu plików: mojplik.seek(n) ustawienie bieżącego miejsca w pliku na N-ty bajt, np.: mojplik.seek(0) przesunięcie bieżącego miejsca na początek pliku i umożliwienie czytania pliku od nowa mojplik.name nazwa pliku (pełna ścieżka dojościa) mojplik.readable() zwraca True albo False w zależności od tego czy z pliku można czytać mojplik.writeable() zwraca True albo False w zależności od tego czy do pliku można zapisywać
Czytanie z pliku p = open(r'e:/plik.txt','r') while True: w = p.readline() if w=='': break print(w,end='') p.close() Czytamy aż nie otrzymamy łańcucha pustego, który oznacza koniec pliku Najprostsze przeiterowanie całego pliku for line in open(r'e:/plik.txt','r'): print(line,end='') Plik jest automatycznie zamykany po zakończeniu pętli for
Buforowanie Zapis do pliku jest buforowany zapis danych do pliku za pomocą np. write() nie powoduje od razu zapisu na fizyczny dysk write() Zapis do bufora w pamięci Zapis całego bufora na dysk po zapełnieniu bufora
Buforowanie Metoda flush()powoduje zapis całej zawartości bufora na dysk fizyczny Przy otwarciu pliku można ustawić tryb buforowania: open( plik.txt, w,tryb) 0: bez buforowania (tylko pliki binarne) 1: buforowanie po linii (tylko pliki takstowe) >1: - używanie bufora o takiej (mniej więcej) wielkości -1: (wartość domyśla) użycie buforowania systemowego (zazwyczaj 4096 lub 8192 bajtów)
Wyjątki Wyjątki to inaczej błędy występujące w trakcie wykonania programu Jeżeli pojawia się wyjątek, wykonanie programu jest przerywane. Jeżeli wyjątek zdarzył się wewnątrz instrukcji try, to sprawdzane jest czy dana instrukcja przechwytuje dany wyjątek. Jeżeli bieżący try nie przechwytuje danego wyjątku, to sprawdzane są wszystkie zewnętrzne instrukcje try w których wystąpił wyjątek Jeżeli żadna instrukcja try nie przechwytuje wyjątku, program jest przerywany.
Wyjątki try/except try: /blok kodu chroniony except IndexError: print('poza zakresem') except (ZeroDivisionError, ValueError): print('dzielenie przez zero lub zła wartość') except: # jakikolwiek wyjątek (na końcu!) print('nieznany wyjątek')
Wyjątki try/except/else try: /blok kodu chroniony except IndexError: print('poza zakresem') except (ZeroDivisionError, ValueError): print('dzielenie przez zero lub zła wartość') except: # jakikolwiek wyjątek (na końcu!) print('nieznany wyjątek') else: /blok wykonywany gdy nie było żadnego wyjątku/
Wyjątki try/finally try: finally: /blok kodu chroniony / blok kody wykonywany zawsze, nawet jeśli pojawił się wyjątek/
Wyjątki try/except/else/finally try: /blok kodu chroniony except IndexError: except: else: finally: print('poza zakresem') # jakikolwiek wyjątek (na końcu!) print('nieznany wyjątek') /blok wykonywany gdy nie było żadnego wyjątku/ / blok kody wykonywany zawsze, nawet jeśli pojawił się wyjątek/
Moduł pickle Moduł implementuje binarny protokół serializacji i de-serializacji obiektów Pythona. Moduł nie jest bezpieczny: umożliwia niechciane wykonanie obcego kodu (dopóki nie otwieramy plików z nieznanych źródeł, to nic nie powinno się stać) Do jednego pliku możemy zapisać jeden obiekt Pythona (np. bibliotekę płyt z przykładu realizowanego na laboratorium)
Moduł pickle import pickle favorite_color = { "lion": "yellow", "kitty": "red" } pickle.dump( favorite_color, open( "save.p", "wb" ) ) import pickle favorite_color = pickle.load( open( "save.p", "rb" ) )
Moduł shelve Bazuje na module pickle Tworzy plik, który jest słownikiem import shelve d = shelve.open('sh.p') d['1']='jeden' d['2']='dwa' for k in d.keys(): print(k) d.close()