Podstawy Pythona - operacje wejscia/wyjscia

Transkrypt

Podstawy Pythona - operacje wejscia/wyjscia
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)
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
uwagi
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