poprzedni temat | w górę | następny temat

Skrypty, słowniki, napisy, pliki

Skrypty

W celu stworzenia skryptu języka Python, zapisujemy kod w pliku o rozszerzeniu .py i nadajemy mu prawa wykonywania.

$ cat > hello.py <<EOF
> #!/usr/bin/env python
> 
> print 'Hello world!'
> EOF
$ chmod a+x hello.py
$ ./hello.py 
Hello world!

Parametry uruchomieniowe

Obiekt argv w module sys to lista napisów będących parametrami wywołania programu.

#!/usr/bin/env python
# encoding: utf-8

import sys

# wypisanie listy w całości:
print sys.argv

# każdy element w osobnej linii:
for x in sys.argv:
    print x

Przykład uruchomienia powyższego programu.

$ ./echo.py 1 2 3 "Parametr wielowyrazowy" '*'
['./echo.py', '1', '2', '3', 'Parametr wielowyrazowy', '*']
./echo.py
1
2
3
Parametr wielowyrazowy
*

Zadanie

Słowniki

Jedną z podstawowych struktur danych w Pythonie jest słownik — dict, nazywany również tablicą asocjacyjną lub mapą.

# pusty słownik:
slownik = {}

# słownik z wartościami początkowymi:
slownik = {
  'klucz': 'wartosc',
  'klucz2': [],
  10: 'dziesiec',
  (1,2,3): 'wartosc dla krotki',
}

# przypisanie wartości dla klucza o wartości 0:
slownik[0] = 'zero'

# nadpisanie wartości dla istniejącego klucza:
slownik['klucz'] = 'nowa wartość'

Klucz słownika musi być obiektem niemodyfikowalnym (ang. immutable), na przykład napisem, liczbą, krotką, w przeciwieństwie do listy i słownika, które są modyfikowalne (ang. mutable). Wartością przypisaną do klucza może być dowolny obiekt, np. ten sam słownik:

slownik['self'] = slownik
slownik
-> {'klucz': 'nowa warto\xc5\x9b\xc4\x87', 0: 'zero', 10: 'dziesiec', (1, 2, 3): 'wartosc dla krotki', 'klucz2': [], 'self': {...}}
slownik['self']
-> {'klucz': 'nowa warto\xc5\x9b\xc4\x87', 0: 'zero', 10: 'dziesiec', (1, 2, 3): 'wartosc dla krotki', 'klucz2': [], 'self': {...}}

Jeśli spróbujemu pobrać ze słownika wartość dla klucza, którego nie ma w słowniku, zostanie rzucony wyjątek KeyError.

print slownik['nie_ma_klucza']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'nie_ma_klucza'

W takim przypadku — jeśli nie chcemy przechwytywać wyjątku — bezpiecznie jest użyć metody get. Jako opcjonalny, drugi argument możemy jej podać domyślną wartość zwracaną w przypadku braku klucza.

print slownik.get('nie_ma_klucza')
None

slownik.get('nie_ma_klucza', 'wartosc domyslna - brakuje klucza')
-> 'wartosc domyslna - brakuje klucza'

Iterowanie po słowniku

Kolejność kluczy w słowniku jest nieokreślona. Jeśli chcesz uzyskać określony porządek kluczy, wykorzystaj OrderedDict.

Iterowanie po kluczach możemy uzyskać za pomocą pętli for.

for x in slownik:
  print x

Wyjście powyższej pętli na ekranie:

klucz
0
10
(1, 2, 3)
klucz2
self

Listę kluczy możemy uzyskać za pomocą metody .keys(). Metoda .values() zwraca listę wartości zapisanych w słowniku. Metoda .items() zwraca listę krotek klucz-wartość, więc chcąc iterować jednocześnie po kluczach i wartościach słownika, napiszemy:

for klucz, wartosc in slownik.items():
  print klucz, wartosc

Napisy

Literały napisowe można zapisywać na wiele sposobów.

napis1 = "abc"
print 'abc'
print '''pierwsza linia
druga linia'''
napis2 = """pierwsza linia
druga linia
trzecia linia"""

Napisy są niemodyfikowalne. Dlatego poniższy kod

lista_napisow = [
  'abc', 'def', 'ghi', 'jkl', 'mno', 'pqr'
]
wynik = ''
for napis in lista_napisow:
  wynik += napis
print wynik

jest nieefektywny, ponieważ w każdym obrocie pętli musi być tworzony nowy obiekt typu napisowego. Zamiast tego, użyj poniższego kodu.

lista_napisow = [
  'abc', 'def', 'ghi', 'jkl', 'mno', 'pqr'
]
print ''.join( lista_napisow ) # pusty separator

'.'.join(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'])
-> 'a.b.c.d.e.f.g.h.i.j.k'

Metoda .join() powoduje użycie napisu jako separatora do połączenia wszystkich napisów w liście.

Przeciwną metodą jest .split(), która zwraca listę napisów powstałą po podzieleniu napisu względem białych znaków (gdy nie podano argumentu) lub napisu podanego jako argument.

'a b c'.split()
-> ['a', 'b', 'c']

'aaa/bbb/c'.split('/')
-> ['aaa', 'bbb', 'c']

Zadanie

Pliki

Aby otworzyć plik, używamy funkcji open(), która przyjmuje nazwę pliku i tryb otwarcia. Jeśli podamy tylko nazwę pliku, zostanie on otwarty do odczytu.

f = open("plik.txt")
print f.read()
f.close()

f = open("plik.txt")
for line in f:
  print line
f.close()

Krótsze i wygodniejsze jest użycie słowa kluczowego with. Za takim blokiem kodu plik jest automatycznie zamknięty.

with open("plik.txt") as f:
  print f.read()
# tutaj plik jest już zamknięty

Zadania

  1. Napisz program, który przyjmuje dwa parametry:

    • nazwę pliku,
    • klucz (słowo).

    Program ma wczytać z podanego pliku napis sformatowany tak, jak w poprzednim zadaniu. Na wyjściu ma być wypisana wartość przypisana do podanego klucza.

  2. Napisz program, który przyjmuje dwa parametry:

    • nazwę pliku lub znak -,
    • dowolny ciąg znaków (np. słowo).

    Program ma otwierać plik, którego nazwę podano jako pierwszy parametr lub użyć sys.stdin, jeśli podano -. Program ma wyświetlić wszystkie linie z podanego pliku, które zawierają podane słowo. Podpowiedź: użyj operatora in.

poprzedni temat | w górę | następny temat