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)

Zamknięcie pliku

fh.close()

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

Zastosowanie

Pakiet dbf

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 histori

● 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

● ...

Własności strumieni Implementacja metod:

● read()

● read(size)

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 url ib

url = 'http://www.notowania.pl/dane.csv'

in_stream = url ib.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