Menu Zamknij

Porównaj styl pisarzy część 10 – Wykorzystanie plików .txt

Do tej pory zajmowaliśmy się przetwarzaniem krótkich tekstów. Co, jeśli zechcesz przeanalizować całą książkę, albo całą bibliografię autora? Czy trzeba całe teksty wkleić w nasz program? Na szczęście nie! W tej części dowiesz się, jak wskazać Pythonowi miejsce, gdzie jest zapisany plik tekstowy i jak taki plik odczytać.

Do dalszych działań potrzebujemy książki w formacie .txt. Wszystkie książki, których użyjemy w naszym kursie pochodzą z serwisu wolnelektury.pl. Książki przekonwertowałem do plików .txt. Taką konwersję można przeprowadzić darmowym programem Calibre.

Pierwsze co musisz zrobić to pobrać książkę z linku poniżej i zapisać w dowolnej lokalizacji, zapamiętaj gdzie ją zapisałeś!

Otwieranie pliku tekstowego jest całkiem proste. Potrzebujesz użyć funkcji open(), a jako argumenty funkcji musisz podać ścieżkę do pliku i tryb, w jakim chcesz pliku użyć. Popatrz na przykład:

>>> ksiazka = open("F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt", "r")
>>> 

Pod zmienną ksiazka podstawiamy zawartość pliku, który otwarliśmy funkcją open(). W nawiasie, jako pierwszy argument podana jest ścieżka do pliku i nazwa pliku wraz z rozszerzeniem. Pamiętaj, że u ciebie ścieżka do pliku może wyglądać inaczej. Czemu używamy podwójnych \\ powinieneś pamiętać z części 4. Drugi argument „r” oznacza, że otwieramy plik w trybie do odczytu – read. Zobaczmy, co stanie się przy wyświetleniu zmiennej książka:

>>> ksiazka = open("F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt", "r")
>>> ksiazka
<_io.TextIOWrapper name='F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt' mode='r' encoding='cp1250'>
>>> 

Wcale nie pokazała się jej zawartość. To, że Python otworzył plik, nie znaczy, że go przeczytał. Na razie książka została załadowana. Żeby ją przeczytać potrzebujemy metody .read(), której użyjemy na otwartym pliku. Nie róbmy tego w terminalu, zacznijmy nowy program!

ksiazka = open("F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt", "r",)
dwiescie_znakow = ksiazka.read(200)

print(ksiazka)
print(dwiescie_znakow)

W 1 linijce otwieramy książkę, pamiętaj, że ścieżka do twojego pliku będzie inna niż u mnie! Książkę otwieramy w trybie read i podstawiamy pod zmienną ksiazka. W 2 linijce używamy metody .read() (metoda ta nie ma nic wspólnego z trybem read funkcji open()) i jako argument funkcji podajemy 200, oznacza to, że zostanie odczytane 200 znaków. Podstawiamy te 200 znaków pod zmienną dwiescie_znakow. W 4 linijce drukujemy zmienną ksiazka. W 5 linijce drukujemy zmienną dwiescie_znakow. Zobaczmy efekt!

======================== RESTART: F:/python38/wpis 10.py =======================
<_io.TextIOWrapper name='F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt' mode='r' encoding='cp1250'>
Janusz Korczak


Bankructwo małego Dżeka





Ta lektura, podobnie jak tysiące innych, jest dostępna on-line na stronie wolnelektury.pl.

Utwór opracowany został w ramach projektu Wolne Lektury 
>>> 

Niezbyt imponujący ten efekt, prawda? Coś niedobrego stało się z polskimi znakami. Zwróć uwagę na to, co wiemy dzięki naszemu programowi o kodowaniu znaków w zmiennej ksiazka. Wśród różnych informacji jest też taka: encoding=’cp1250′. Jeśli interesuje Cię temat kodowania, można zacząć od Wikipedii. Pliki, które przygotowałem, są kodowane w utf-8, a nasz program domyślnie zdecydował, że użyje kodowania cp1250. Na szczęście funkcji open() można wskazać jakiego kodowania ma użyć. Zróbmy to:

ksiazka = open("F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt", "r", encoding = "utf-8")
dwiescie_znakow = ksiazka.read(200)

print(ksiazka)
print(dwiescie_znakow)

W 1 linjce do funkcji open() dodaliśmy kolejny argument encoding = "utf-8". Zobaczmy efekt:

======================== RESTART: F:/python38/wpis 10.py =======================
<_io.TextIOWrapper name='F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt' mode='r' encoding='utf-8'>
Janusz Korczak


Bankructwo małego Dżeka





Ta lektura, podobnie jak tysiące innych, jest dostępna on-line na stronie wolnelektury.pl.

Utwór opracowany został w ramach projektu Wolne Lektury przez 
>>> 

Jest dużo lepiej. Mamy prawidłowo zidentyfikowane kodowanie i wszystkie polskie znaki wyświetlają się tak, jak oczekujemy. To, czego zupełnie nie potrzebujemy to znaki nowej linii, czyli entery. W części 4 dowiedziałeś już się jak działa znak nowej linii \n. Teraz użyjemy metody .replace() do zastąpienia znaku nowej linii pustym stringiem. Argumentami metody .replace() jest szukany tekst i tekst na jaki chcesz zamienić szukany tekst. Działa to zupełnie jak znajdź i zamień w popularnych edytorach tekstu. Poprawmy nasz program:

ksiazka = open("F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt", "r", encoding = "utf-8")
dwiescie_znakow = ksiazka.read(200)
dwiescie_znakow = dwiescie_znakow.replace("\n", "")

print(ksiazka)
print(dwiescie_znakow)

W 3 linijce na zmiennej dwiescie_znakow użyliśmy metody .replace(), która znak nowej linii („\n”) zamienia na pusty string („”). Zobaczmy efekt:

======================== RESTART: F:/python38/wpis 10.py =======================
<_io.TextIOWrapper name='F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt' mode='r' encoding='utf-8'>
Janusz KorczakBankructwo małego DżekaTa lektura, podobnie jak tysiące innych, jest dostępna on-line na stronie wolnelektury.pl.Utwór opracowany został w ramach projektu Wolne Lektury przez 
>>> 

No niedobrze! Tak napisany program skleja nam ostatnie słowo przed enterem ze słowem po enterze. Zmieńmy program, by znak nowej linii zastępowała spacja:

ksiazka = open("F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt", "r", encoding = "utf-8")
dwiescie_znakow = ksiazka.read(200)
dwiescie_znakow = dwiescie_znakow.replace("\n", " ")

print(ksiazka)
print(dwiescie_znakow)

I zobaczmy efekt:

======================== RESTART: F:/python38/wpis 10.py =======================
<_io.TextIOWrapper name='F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt' mode='r' encoding='utf-8'>
Janusz Korczak   Bankructwo małego Dżeka      Ta lektura, podobnie jak tysiące innych, jest dostępna on-line na stronie wolnelektury.pl.  Utwór opracowany został w ramach projektu Wolne Lektury przez 
>>> 

Taki program nas zadowala. Co prawda mamy nadmiarowe spacje, ale w części 9 nauczyliśmy się ich usuwania.

Nauczmy się jeszcze zapisywać dane do pliku. Pewnie zauważyłeś w części 9, że wyświetlanie dużej ilości tekstu, elementów list, kluczy i wartości słowników sprawia, że terminal IDLE reaguje opornie i z opóźnieniami. Zamiast wyświetlać wynik działania programu w terminalu, można go zapisać do pliku. Popatrz na poniższy program:

ksiazka = open("F:\\python\\ids\\Bankructwo malego Dzeka - Janusz Korczak.txt", "r", encoding = "utf-8")
zapisane_200_znakow = open("F:\\python\\ids\\200_znakow.txt", "w", encoding = "utf-8")
dwiescie_znakow = ksiazka.read(200)
dwiescie_znakow = dwiescie_znakow.replace("\n", " ")

zapisane_200_znakow.write(dwiescie_znakow)
zapisane_200_znakow.close()

Co zmieniliśmy? W 2 linijce w argumentach funkcji open() podajemy ścieżkę do pliku, w którym chcemy zapisać nasze dane, podajemy też argument”w” od write, czyli informujemy, że do pliku będziemy chcieli zapisywać dane, oraz na wszelki wypadek ustawiamy kodowanie. Podstawiamy tę funkcję pod zmienną zapisane_200_znakow. Nie musisz osobno tworzyć pustego pliku, jeśli Python go nie znajdzie, utworzy go sam. W 6 linijce metodą .write() zapisujemy pod zmienną zapisane_200_znakow 200 znaków znajdujących się pod zmienną dwiescie_znakow. W 7 linijce metodą .close() zamykamy plik. Pamiętaj, dopóki nie zamkniesz pliku zmiany nie zostaną zapisane w pliku! Uruchommy program:

======================== RESTART: F:/python38/wpis 10.py =======================
>>> 

Terminal nie pokazał nam nic zachwycającego, ale jeśli odszukasz plik, i otworzysz go, jego zawartość powinna być następująca:

Janusz Korczak   Bankructwo małego Dżeka      Ta lektura, podobnie jak tysiące innych, jest dostępna on-line na stronie wolnelektury.pl.  Utwór opracowany został w ramach projektu Wolne Lektury przez 

Udało się! W następnej części policzymy częstość występowania 3-gramów dla całych książek.

Zadanie domowe

Podążanie za instrukcjami, nawet jeśli je wszystkie wykonujesz samodzielnie, nie zrobi z ciebie programisty. Zadania domowe mogą wydawać się na początku trudne. Tu nie ma rozwiązania podanego na talerzu, użyj dowolnych źródeł, by znaleźć odpowiedź.

  1. Spróbuj w jednym programie zapisać do pliku 200, a następnie 100 znaków. Po tych operacjach zamknij plik. Jaki jest efekt takiego zapisu? Znajdź sposób, by do jednego pliku zapisać kilka stringów bez nadpisywania poprzednich.
  2. Napisz program, który otworzy plik z zapisanymi 200 znakami. Potem użyj pętli for (może więcej niż jednej) by wydrukować w terminalu kolejne litery, jedna pod drugą.

0 0 votes
Ocena artykułu

0 komentarzy
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
0
Chcesz podzielić się komentarzem?x