Plan podstawowe operacje we/wy standardowe wejście czytanie/pisanie do plików, dla wersji starszych niż 2.6 ustawienie zmiennych środowiskowych czytanie/pisanie z użyciem konstrukcji with serializacja obiektów, pickle i cpickle pliki konfiguracyjne, ConfigParser gzip i tar pakiet os.path - standardowe operacje na ścieżkach pakiet os - funkcje systemowe popen, subprocess Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 1 / 22
standardowe wejście czytanie ze standardowego wejścia Do pobierania argumentów, odpowiednik cin, służy funkcja raw input([prompt]),czyta linię ze standardowego wejścia sys.stdin, sys.std.out i sys.stderr - strumienie wejścia, wyjścia i błędu przekazywanie argumentów do programu argumenty programu dostępna jest po imporcie listy argv z pakietu sys argv[0] to nazwa skryptu Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 2 / 22
standardowe wejście przykład #!/usr/bin/python # -*- coding: utf-8 -*- from sys import argv, stdin, stdout print argv[0] print argv choice = raw_input( Czy na pewno chcesz zakończyć działanie programu?\n ) print choice print Spróbuj jeszcze raz :) choice = stdin.readline() if choice[:-1]== tak : stdout.write( choice[:-1] + :)\n ) stdout.flush() Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 3 / 22
ustawienie zmiennych środowiskowych ustawienie Python 2.6 jako wersji domyślnej domyślnie będziemy używać powłoki bash dodać w.bash profile ścieżkę do katalogu zawierającego instalację Pythona 2.6 export PATH = /opt/python/python2.6/bin/ : $PATH source.bash profile sprawdzić domyślną wersję pythona, python --version Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 4 / 22
czytanie/pisanie do plików otwieranie plików - funkcja open( filename, mode) uwagi zwraca obiekt typu plik argument 1 - napis nazwa( ścieżka względna lub bezwzględna) pliku do otworzenia mode - tryb otwarcia, możliwe są r, w i a w systemie Windows rozróżniane są pliki tekstowe i binarne, pojawia się więc dodatkowa litera dla trybu - b zamknięcie pliku ( zakończenie wszystkich rozpoczętych operacji ) przy pomocy od wersji 2.6 do otwierania plików wykorzystuje się wyrażenie with, nie trzeba martwić się zamykaniem pliku można również do operacji na plikach używać funkcji systemowych z modułu os Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 5 / 22
czytanie/pisanie do plików pliki - przegląd funkcji read( [size] ) - zwraca określoną ilość bajtów z pliku, albo cały plik readline, readlines - zwracają jedną albo wszystkie linie tell - zwraca pozycję w pliku seek - skok do określonej pozycji w pliku write, writelines - zapis napisu/sekwencji napisów do pliku Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 6 / 22
czytanie/pisanie do plików zapis pliku wejściowego z odwróceniem kolejności znaków w każdej z linii #!/usr/bin/python # -*- coding: utf-8 -*- from sys import argv input_file = argv[1] output_file = argv[2] # plik wejsciowy, wczytanie zawartości with open(input_file, r ) as f: input_lines = f.readlines() # funkcja do odwracania napisow def rev(x): return x[::-1] #zapis do pliku wyjsciowego with open(output_file, w ) as f: for line in input_lines: f.write( rev(line[:-1]) + \n ) Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 7 / 22
przykład -czytanie/pisanie do plików Plik.csv - zamiast awk i owl :) weźmy dowolny wielomian n stopnia (np 3) wygenerujmy w przedziale (0,1000) ze skokiem 0.5 wartości dla każdego z członów wielomianu osobno wygenerowane wartości zapisać do pliku w postaci ( lp x A B*x C*x*x... ) z tak wygenerowanego pliku, wymnożyć wartości 2 i 4 kolumny, dla co trzeciej linii Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 8 / 22
serializacja obiektów, pickle i cpickle cpickle jest szybszą(do 1000x) zaimplementowaną w C wersją pickle można serializować typy proste, kolekcje, klasy i funkcje zdefiniowane w najwyższym poziomie modułu dostępne są dwa tryby zapisu/odczytu z/do pliku i z/do napisu - funkcje dump, dumps, load, loads rozmiar serializowanych obiektów zależy od wybranego protokołu serializacji, jest on parametrem powyżej wspomnianych funkcji, generalnie im jest wyższy tym rozmiar danych jest mniejszy, najwyższym protokołem jest HIGHEST PROTOCOL Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 9 / 22
serializacja obiektów, pickle i cpickle cpickle jest szybszą(do 1000x) zaimplementowaną w C wersją pickle można serializować typy proste, kolekcje, klasy i funkcje zdefiniowane w najwyższym poziomie modułu dostępne są dwa tryby zapisu/odczytu z/do pliku i z/do napisu - funkcje dump, dumps, load, loads rozmiar serializowanych obiektów zależy od wybranego protokołu serializacji, jest on parametrem powyżej wspomnianych funkcji, generalnie im jest wyższy tym rozmiar danych jest mniejszy, najwyższym protokołem jest HIGHEST PROTOCOL Why Python Pickle is Insecure - http://nadiana.com/python-pickle-insecure Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 9 / 22
pliki konfiguracyjne, ConfigParser moduł ConfigParser prosta i zautomatyzowana obsługa plików konfiguracyjnych pliki dzielone są na sekcje [section] sekcje zawierają opcje w postaci par key=value, : jest również akceptowalny jako separator ConfigParser - przegląd funkcji read, write - odczyt zapis konfiguracji items( sections ) - zwraca listę par ( k, v ) zbudowaną na podstawie wszystkich opcji danej sekcji get( section, option ) - zwraca wartość danej opcji set( section, option, value ) - ustawia wartość value dla opcji w danej sekcji Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 10 / 22
pliki konfiguracyjne - przykłady plik konfiguracyjny [manager] whoami : server [server] threads: 8 memory_gb = 12 thread_params: 2, 4, 6 prefix:server_ input_data : %(prefix)sdata_in input_metadata : %(prefix)smetadata logs = %(prefix)slogs directory = pliki output = %(directory)s/%(prefix)soutfile Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 11 / 22
pliki konfiguracyjne - przykłady plik konfiguracyjny - operacje #!/usr/bin/python # -*- coding: utf-8 -*- from sys import argv from ConfigParser import SafeConfigParser # parse configuration config = SafeConfigParser() config.read( argv[1] ) whoami = config.get( manager, whoami ) section_items, section_dict = config.items(whoami), {} # wstawianie do słownika listy par section_dict.update( section_items ) #dodanie sekcji i opcji new_section, new_option, new_value = section, option, value config.add_section(new_section) config.set( new_section, new_option, new_value ) # zapis with open( section_dict[ output ], w ) as f: config.write( f ) Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 12 / 22
gzip i tar #!/usr/bin/python # -*- coding: utf-8 -*- from sys import argv from gzip import open as gzip_open #compress with open( argv[1] ) as in_f: # compresslevel od 1 do 9, domyślnie 9 gzip_f = gzip_open( argv[2] +.gz, w, compresslevel=5 ) gzip_f.writelines( in_f.readlines() ) gzip_f.close() # decompress f = gzip_open( argv[2] +.gz, r ) with open( argv[2] +.back, w ) as back_f: back_f.write( f.read() ) f.close() # compare outputs from os import system system( diff + argv[1] + + argv[2]+.back ) Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 13 / 22
gzip i tar archiwa tar Wbudowaną obsługę archiwów tar zapewnia pakiet tarfile Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 14 / 22
os.path - operacje na ścieżkach przegląd funkcjonalności pakietu isdir, isfile - sprawdzenie czy ścieżka jest plikiem lub katalogiem join - dodaje element do ścieżki split - rozdziela ścieżkę, tworzy parę (prefix, ostatni element) walk(path, visit, arg) - służy do rekurencyjnego przechodzenia przez drzewo katalogów z jednoczesnym wywołaniem funkcji visit Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 15 / 22
os.path - operacje na ścieżkach przykład - znalezienie wszystkich plików w drzewie z rozszerzeniem pdf #!/usr/bin/python # -*- coding: utf-8 -*- from os.path import walk def pick_files(result, dirname, file_names, extension= pdf ): # file_names is a result of os.listdir( dirname ) for file in file_names: # check if this is a pdf file if file.find( extension ) > 0: result.append( ( dirname, file ) ) # walk through tree from sys import argv dir = argv[1] pdf_list = [] walk( dir, pick_files, pdf_list) for entry in pdf_list: print entry Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 16 / 22
pakiet os - wykorzystanie funkcji systemowych operacje na plikach i ścieżkach - mkdir, chown, rename... ustawianie zmiennych środowiskowych - getenv, putenv zarządzanie procesami - kill, fork... Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 17 / 22
popen, subprocess - zarządzanie procesami popen pakiet popen pozwala na mnożenie osobnych procesów i podłączenie się do ich strumieni wejścia, wyjścia i błędu subprocess Zapewnia większa kontrolę nad sposobem wywołania pod-procesu, pozwala na jawne określenie strumieni, katalogu roboczego,... Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 18 / 22
popen, subprocess - zarządzanie procesami subprocess - przykład Chcielibyśmy uruchomić skrypt #!/usr/bin/python # -*- coding: utf-8 -*- from sys import stdin, stdout, argv stdout.write( echo.py: starting\n ) stdout.flush() multi = int( argv[1] ) while True: next_line = stdin.readline() if not next_line: break value = int( next_line.strip() ) * multi stdout.write( %d\n %value) stdout.flush() stdout.write( echo.py: exiting\n ) stdout.flush() Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 19 / 22
popen, subprocess - zarządzanie procesami subprocess - przykład, cd. Komunikacja pomiędzy procesami za pomocą stdin i stdout #!/usr/bin/python # -*- coding: utf-8 -*- from subprocess import Popen, PIPE import subprocess przykład oparty na http://www.doughellmann.com/pymotw/subprocess/ command = [ pliki/echo.py, 2 ] zdefiniowanie stdin i sdtout jako obiektow PIPE pozwala na komunikowanie sie z procesem proc = subprocess.popen(command, stdin=pipe, stdout=pipe ) print proc.stdout.readline().strip() value, i = 1, 1 while value<10**6: proc.stdin.write( %d\n % value) value = int( proc.stdout.readline().strip() ) print i, value i+=1 communicate, czeka aż proces zakończy działanie print proc.communicate() Łukasz Ligowski, Sławomir Walkowiak (ICM UW) Podstawy Pythona - operacje wejścia/wyjścia 22 lutego 2011 20 / 22