Kurs języka Python Wykład 6. Pliki tekstowe Pliki rekordów Pliki CSV Strumienie
Operacje na plikach Otwarcie i zamknięcie pliku: fh = open('plik', 'r') Atrybuty: 'r' odczyt 'w' zapis 'a' dopisanie 'r+' - odczyt i zapis 'rb', 'wb', 'ab' odczyt i zapis binarny (tylko Windows i Macintosh)
fh.close() Zamknięcie pliku
Odczyt pliku fh.read() - odczyt całego pliku fh.read(size) - odczyt tylko size znaków, gdy koniec pliku zwracane jest fh.readline() - zwraca wiersz, razem z '\n' fh.readlines() - zwraca listę wierszy
Odczyt z pliku przykład fh = open('test.py', 'r') while True: wiersz = fh.readline() if len(wiersz) == 0: break print wiersz, fh.close()
Odczyt z pliku przykład poprawiony fh = open('test.py', 'r') for wiersz in fh: print wiersz,
Zapis do pliku fh.write('dane zapisywane do pliku\n') fh.writelines(['to\n', 'są\n', 'kolejne\n', 'wiersze\n'])
Rodzaje danych w plikach Pliki tekstowe Pliki z rekordami Pliki CVS Pliki *.ini XML...
Przetwarzanie rekordów PLIK Rekord 0 Rekord 1 Rekord 2 Rekord 3 REKORD int char[16] char[40] bool float data
Konwersja string <-- rekord import struct numrec, lenheader = struct.unpack('<xxxxlh22x', f.read(32)) name, typ, size, deci = struct.unpack('<11sc4xbb14x', rec)
Konwersja string --> rekord hdr = struct.pack('<bbbblhh20x', ver, yr, mon, day, numrec, lenheader, lenrecord)
Pack i unpack: formatowanie <liczba> - powtórzenie 'x' nieistotny bajt, np. '4x' == 'xxxx' 'c' znak 'i' int 's', 'p' stringi Dodatkowe znaki: '<' - little endian '>' - big endian
Pakiet dbf Zastosowanie
Przechowywanie obiektów w pliku import pickle fh = open('plik.obj', 'w') pickle.dump(obj, fh) fh.close()
Odczyt obiektu z pliku import pickle fh = open('plik.obj', 'r') obj = pickle.load(fh) fh.close()
Odczyt ze standardowego wejścia x = raw_input('podaj jakiekolwiek dane: ') Wczytanie i obliczenie x = input('podaj wyrażenie') print x
Bardziej zaawansowana interakcja Pakiet readline: Odczyt i zapis historii Uzupełnianie
Pliki *.ini Plik.gnome2/gedit-2: [window] height=487 width=601 state=0 [time_plugin] prompt_type=1
Odczyt pliku ini import ConfigParser ini = ConfigParser.ConfigParser() print ini.sections() print ini.getint('window', 'height') print ini.items('window')
Zmiany Modyfikacja parametrów: ini.set('window', 'height', 100) Usuwanie: ini.remove_option('window', 'height') ini.remove_section('window')
Zapis konfiguracji fh = open('konfig.ini', 'w') ini.write(fh) fh.close()
Pliki CSV CSV Comma Separated Values Dane imie1, nazwisko1, 2000-01-01, 3 imie2, nazw3, 2006-04-01, 2 Notowania giełdowe 2006-04-26;1415.79;183.29;102.14; 2006-04-25;1415.88;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
CSV - dialekty Dialekt: domyślne parametry, np. dialekt excel Możliwość dodania własnego dialektu
Odczyt CSV -przykład import csv reader = csv.reader( open('/etc/passwd', 'r'), delimiter=':', quoting=csv.quote_none) for row in reader: print row
Zapis w formacie CSV przykład import csv data = [ [1, 'Oskar'], [2, 'Mis'] ] writer = csv.writer( open('out', "w"), dialect=csv.excel) writer.writerows(data)
CSV - słowniki Data;FS;FO;FOE;FSW;FZ;FPA;FRP;FANE; 2006-05-05;1416.17;183.01;101.80;123.63; 2006-05-04;1416.03;183.11;101.95;123.48; 2006-05-02;1415.79;183.06;101.93;123.43;
CSV słowniki - przykład fh = open('notowania.csv', "r") reader = csv.dictreader(fh, delimiter=';') for row in reader: for k in row.keys(): print k, row[k]
CSV - słowniki Własne klucze: fh = open('notowania.csv', "r") klucze = ['lp', 'name'] reader = csv.dictreader(fh, fieldnames= klucze) for row in reader: print row['lp'], row['name']
Strumienie - motywacje def przegladaj_notowania(zrodlo): reader = csv.dictreader(zrodlo, delimiter=';') for row in reader: for k in row.keys(): print k, row[k]
Strumienie - motywacje przegladaj_notowania('dane.csv') url = 'http://www.notowania.pl/dane.csv' przegladaj_notowania(url)
Strumienie danych Plik dyskowy Sieć Zmienna typu string...
Implementacja metod: read() read(size) Własności strumieni
Przykład def przegladaj_notowania(zrodlo): reader = csv.dictreader(zrodlo, delimiter=';') for row in reader: for k in row.keys(): print k, row[k]
Plik dyskowy jako strumień in_stream = open('dane.csv', 'r') przegladaj_notowania(in_stream) in_stream.close()
Strumień danych - URL import urllib url = 'http://www.notowania.pl/dane.csv' in_stream = urllib.urlopen(url) przegladaj_notowania(in_stream) in_stream.close()
String jako strumień Str = '2006-11-13;12.45;45.78' import StringIO in_stream = StringIO.StringIO(str) przegladaj_notowania(in_stream) in_stream.close()
Na koniec