16. Operacje na plikach

16.1. Konstrukcja with

  • Context manager

16.2. Czytanie

Code Listing 16.1. Reading from file
FILENAME = '/etc/hostname'


with open(FILENAME) as file:
    for line in file:
        print(line)


with open(FILENAME) as file:
    content = file.read()


with open(FILENAME) as file:
    content = file.readlines()


with open(FILENAME) as file:
    for line in file.readlines()[30:50]:
        print(line)

16.3. Zapis

Code Listing 16.2. Writing to file
FILENAME = '/etc/hostname'


with open(FILENAME, 'w') as file:
    file.write('foobar')


with open(FILENAME, 'a') as file:
    file.write('foobar')

16.4. Tryby odczytu i zapisu

Character Meaning
'r' open for reading (default)
'w' open for writing, truncating the file first
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
'+' open a disk file for updating (reading and writing)

16.5. Obsługa wyjątków

Code Listing 16.3. Exception handling while accessing files
FILENAME = input('Podaj nazwę pliku: ')


try:
    with open(FILENAME, 'w') as file:
        content = file.read()
        print(content)

except FileNotFoundError:
    print('File does not exists')

except PermissionError:
    print('Brak uprawnien')

16.6. Zadania kontrolne

16.6.1. Zawartość zadanego pliku

  1. Napisz program, który wyświetli na ekranie zawartość pliku o nazwie podanej przez użytkownika.
  2. Dopisz obsługę wyjątków dla braku uprawnień oraz tego że plik nie istnieje.

16.6.2. Parsowanie /etc/hosts

  1. Do pliku hosts w katalogu gdzie będzie Twój skrypt zapisz poniższy szablon: Code Listing 16.4.
  2. Ważne są komentarze, białe spacje i linie przerwy
  3. Przedstaw go w formie listy dictów jak w przykładzie poniżej: Code Listing 16.5.
  4. Zwróć uwagę na uprawnienia do odczytu pliku
Co zadanie sprawdza?:
 
  • czytanie i parsowanie pliku
  • nieregularne pliki konfiguracyjne (struktura może się zmieniać)
  • filtrowanie elementów
  • korzystanie z pętli i instrukcji warunkowych
  • parsowanie stringów
  • praca ze ścieżkami w systemie operacyjnym
Podpowiedź:
  • kod powinien mieć około 10 linii
Code Listing 16.4. Przykładowa zawartość pliku /etc/hosts
##
# Host Database
#   - Unix: /etc/hosts
#   - Windows: C:\Windows\System32\drivers\etc\hosts
##

127.0.0.1       localhost
127.0.0.1       astromatt
10.13.37.1      nasa.gov esa.int roscosmos.ru
255.255.255.255 broadcasthost
::1             localhost
Code Listing 16.5. /etc/hosts example
[
    {'ip': '127.0.0.1', 'hostnames': ['localhost'], 'protocol': 'ipv4'},
    {'ip': '127.0.0.1', 'hostnames': ['astromatt'], 'protocol': 'ipv4'},
    {'ip': '10.13.37.1', 'hostnames': ['nasa.gov', 'esa.int', 'roscosmos.ru'], 'protocol': 'ipv4'},
    {'ip': '255.255.255.255', 'hostnames': ['broadcasthost'], 'protocol': 'ipv4'},
    {'ip': '::1', 'hostnames': ['localhost'], 'protocol': 'ipv6'},
]