# W tej wersji do podziału każdej linii na słowa wykorzystamy wyrażenia regularne.
# Teoretycznie można by wczytać cały plik za pomocą read() i dopiero podzielić na słowa,
# ale zwn wydajność preferujemy przetwarzanie linia za linią, stąd dwupoziomowa pętla.
# Również zwn na wydajność lepiej jest najpierw "skompilować" wyrażenie regularne, a później używać wersji skompilowanej, tzw. "patternu".
# Dotyczy to sytuacji, gdy to samo wyrażenie jest używane wielokrotnie, np. w pętli.

import re

# znaczenie wzorca: niepusty ciąg znaków typu 'w', co obejmuje litery (wszelkich alfabetów), cyfry i znak _
pattern = re.compile(r'\w+')

nr = 0
with open('pan_tadeusz.txt', mode='r', encoding='utf-8') as plik:
    for linia in plik:
        for slowo in re.findall(pattern, linia):  # albo: for slowo in pattern.findall(linia):
            nr += 1
            print(slowo)

print('Liczba wszystkich słów:', nr)
