7. Files

7.1. Read, Write, Append

7.1.1. Path

  • Relative and absolute path
  • FILENAME as a raw string r'...' constant

7.1.2. Good Engineering Practises

  • encoding='utf-8'

7.1.3. Access modes

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
'rb' read binary mode
'ab' append binary mode
'wb' write binary mode

7.1.4. Reading file

  • Fails when directory with file cannot be accessed
  • Fails when file cannot be accessed
Code Listing 7.2. Read whole file as a text to content variable
FILENAME = r'C:\Temp\bootfilure.txt'


with open(FILENAME, encoding='utf-8') as file:
    content = file.read()
Code Listing 7.3. Convert file to list by line
FILENAME = r'C:\Temp\bootfilure.txt'


with open(FILENAME, encoding='utf-8') as file:
    lines_in_file = file.readlines()
Code Listing 7.4. Convert file to list by line, select 1-30 lines
FILENAME = r'C:\Temp\bootfilure.txt'


with open(FILENAME, encoding='utf-8') as file:
    selected_lines = file.readlines()[1:30]
Code Listing 7.5. By default file can be iterated by line similar to file.readlines()
FILENAME = r'C:\Temp\bootfilure.txt'


with open(FILENAME, encoding='utf-8') as file:
    for line in file:
        if not line.startswith('#'):
            print(line)

7.1.5. Writing to file

  • Fails when directory with file cannot be accessed
  • Creates file if not exists
  • Overwrite old content
Code Listing 7.6. Writing to file
FILENAME = r'C:\Temp\bootfilure.txt'


with open(FILENAME, mode='w', encoding='utf-8') as file:
    file.write('hello')

7.1.6. Appending to file

  • Fails when directory with file cannot be accessed
  • Creates file if not exists
  • Append to the end of file
Code Listing 7.7. Appending to file
FILENAME = r'C:\Temp\bootfilure.txt'


with open(FILENAME, mode='a', encoding='utf-8') as file:
    file.write('hello')

7.2. Exception handling

Code Listing 7.8. Exception handling while accessing files
FILENAME = r'C:\Temp\bootfilure.txt'

try:
    with open(FILENAME, mode='r', encoding='utf-8') as file:
        content = file.read()
        print(content)

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

except PermissionError:
    print('Permission denied')

7.3. Assignments

7.3.1. Content of a requested file

  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.
About:
  • Filename: file_content.py
  • Lines of code to write: 5 lines
  • Estimated time of completion: 5 min

7.3.2. Parsing /etc/hosts

  1. Do pliku hosts.txt w katalogu gdzie będzie Twój skrypt zapisz kod z szablonu: Code Listing 7.9.
  2. Ważne, żeby przepisać zawartość zawierającą komentarze, białe spacje i linie przerwy
  3. Przeglądając plik linijka po linijce sparsuj go i przedstaw w formie listy dictów jak w przykładzie poniżej: Code Listing 7.10.
  4. Zwróć uwagę na uprawnienia do odczytu pliku
  5. Wykorzystaj inline if do sprawdzenia: jeżeli jest kropka w adresie IP to IPv4 w przeciwnym przypadku IPv6
About:
  • Filename: file_hosts.py
  • Lines of code to write: 10 lines
  • Estimated time of completion: 20 min
Algorithm:
  1. Utwórz plik i skopiuj zawartość
  2. Otwórz plik
  3. Dla każdej linii:
  4. Jeżeli linia jest pusta, lub jest białym znakiem lub zaczyna się od komentarza, przeskocz do kolejnej linii
  5. Podziel linię po białych znakach
  6. Wydziel ip i hosty
  7. Jeżeli jest kropka w adresie IP to IPv4 w przeciwnym przypadku IPv6
  8. Do listy dopisz słownik z ip, hostami i protokołem
  9. Po zakończeniu parsowania wyświetl na ekranie
The whys and wherefores:
 
  • 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
Hints:
  • str.isspace()
  • value = True if ... else False
Code Listing 7.9. Przykładowa zawartość pliku hosts.txt
##
# 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 7.10. /etc/hosts example
[
    {'hostnames': ['localhost'], 'ip': '127.0.0.1', 'protocol': 'ipv4'},
    {'hostnames': ['astromatt'], 'ip': '127.0.0.1', 'protocol': 'ipv4'},
    {'hostnames': ['nasa.gov', 'esa.int', 'roscosmos.ru'], 'ip': '10.13.37.1', 'protocol': 'ipv4'},
    {'hostnames': ['broadcasthost'], 'ip': '255.255.255.255', 'protocol': 'ipv4'},
    {'hostnames': ['localhost'], 'ip': '::1', 'protocol': 'ipv6'}
]