23. Files

23.1. Read, Write, Append

23.1.1. 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

23.1.2. Reading file

  • FILENAME as a raw string r'...' constant
  • encoding='utf-8'
  • Fails when file cannot be accessed
  • Fails when directory with file cannot be accessed
Code Listing 23.1. 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 23.2. 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 23.3. 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 23.4. 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)

23.1.3. Writing to file

  • FILENAME as a raw string r'...' constant
  • encoding='utf-8'
  • If file doesn’t exist it will be created
  • Fails when directory with file cannot be accessed
  • Overwrite old content
Code Listing 23.5. Writing to file
FILENAME = r'C:\Temp\bootfilure.txt'


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

23.1.4. Appending to file

  • FILENAME as a raw string r'...' constant
  • encoding='utf-8'
  • If file doesn’t exist it will be created
  • Fails when directory with file cannot be accessed
  • Append to the end of file
Code Listing 23.6. Appending to file
FILENAME = r'C:\Temp\bootfilure.txt'


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

23.2. Exception handling

Code Listing 23.7. 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')

23.3. Assignments

23.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

23.3.2. Parsing /etc/hosts

  1. Do pliku hosts.txt w katalogu gdzie będzie Twój skrypt zapisz kod z szablonu: Code Listing 23.8.
  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 23.9.
  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()
Code Listing 23.8. 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 23.9. /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'}
]