Nauka Podstaw Pythona, python

Nauka Podstaw Pythona – obsługa plików

Nauka Podstaw Pythona - Obsługa plików

Obsługa plików jest jedną z podstawowych umiejętności w przyborniku każdego programisty. Odczyt danych zapisanych w plikach, wczytywanie plików konfiguracyjnych, zapisywanie poszczególnych danych do plików – wszystko to wykorzystane w naszych programach wpłynie na ich użyteczność. W tym artykule pokażę Ci jak obsługiwać pliki w Pythonie.

Przed zapoznaniem się z treścią tego artykułu zachęcam Cię do przeczytania moich innych wpisów z podstaw Pythona: o napisach i typach danych.

Zmienne plikowe

Do obsługi plików potrzebujesz specjalnej zmiennej, która będzie pełniła rolę uchwytu do pliku.

Wszelkie operacje związane z plikiem wykonuje się właśnie poprzez wykonywanie metod oferowanych przez zmienną plikową. Aby stworzyć zmienną plikową należy otworzyć plik.

Otwieranie pliku

Do otwierania pliku służy metoda open. Zwraca ona uchwyt do pliku. Metoda za argument przyjmuje ścieżkę do pliku.

Ścieżka do pliku

Jeżeli plik, który chcemy otworzyć znajduje się w tym samym katalogu co wykonywany plik Pythona wystarczy, że podamy jego nazwę (ścieżka relative).

Jeśli plik znajduje się w innym miejscu na naszym komputerze podajemy całą ścieżkę do pliku (ścieżka absolute).

UWAGA! Jeżeli pracujesz na systemie Windows to podając pełną ścieżkę do pliku stosuj podwójne ukośniki (\) tak jak na powyższym kodzie. Jest to związane z tym, że ukośnik w napisach traktowany jest jako symbol ucieczki (o czym możesz przeczytać w tym artykule).

Jeśli podamy nazwę nieistniejącego pliku to zostanie on utworzony.

Tryby otwarcia pliku

Drugim często stosowanym argumentem metody jest tryb otwarcia pliku.

Najczęściej stosowane tryby to:

  • r” – plik otwarty do odczytu (read)
  • w” – plik otwarty do zapisu (write), przed zapisem zawartość pliku jest usuwana
  • a” – plik otwarty do zapisu, dodaje nową treść na końcu pliku, nie usuwa starej (append)

Domyślnie wszystkie pliki otwierane są w trybie tekstowym. Możemy otwierać je również w trybie binarnym dodając flagę ‘b‘. Na przykład “rb” otworzy nam plik do oczytu binarnie.

Użycie operatora ‘+’ pozwoli na otwarcie pliku zarówno do zapisu jak i odczytu (np “r+”).

Mając już tę wiedzę możesz po prostu otworzyć plik

Kodowanie

Problemy z kodowaniem plików szczególnie często zdarzają się przy obsłudze polskojęzycznych tekstów.

Plik zapisany z nieprawidłowym kodowaniem może sprawić, że zamiast polskich znaków widać będzie dziwaczne symbole.

Aby naprawić ten problem często wystarczy otworzyć plik z kodowanie w standardzie ‘UTF-8’.

Otworzenie tego samego pliku z kodowaniem ASCII i próba czytania go wywoła błąd:

Odczyt z pliku

Zawartość otwartego pliku możemy wczytać od razu w całości, bądź czytać go linia po linii.

Odczyt całego pliku

Aby odczytać całą treść pliku skorzystaj z metody read.

Za pomocą tej samej metody możemy przeczytać konkretną liczbę znaków podaną przez nas jako parametr metody:

UWAGA! Po odczytaniu zawartości pliku zostaje ona “wykasowana” ze zmiennej plikowej. W praktyce wygląda to tak, że “wskaźnik” odpowiadający za czytanie pliku przesuwa się. Można to porównać do przesuwania palcem po książce podczas czytania.

czytanie

Nie zdziw się więc, że po odczytaniu całego pliku następne wywołanie metody read zwróci pusty napis.

Czytanie pliku liniami

Aby odczytać pojedyczną linię z pliku użyj polecenia readline.

Jak widać zczytana została cała pierwsza linia pliku (wraz ze znakiem końca linii).

Ponowne użycie metody pozwoli na wczytanie następnej linii:

Plik możemy czytać linia po linii za pomocą pętli:

Aby pozbyć się dodatkowych odstępów możemy użyć parametru end w funkcji print:

Inną opcją jest wczytanie wszystkich linii pliku do listy. Służy do tego metoda readlines.

Czytanie znak po znaku

Wcześniej pokazałem Ci, że można czytać konkretną liczbę znaków z pliku. Korzystając z tego możemy czytać plik znak po znaku:

Zapis do pliku

Do zapisu do pliku służy metoda write.

UWAGA! Wartość podana do zapisu musi być napisem(stringiem)!

Do pliku zapisany został podany tekst. Jak widać na powyższym przykładzie metoda write zwraca liczbę zapisanych znaków.

Jeżeli chcesz aby w pliku znalazł się znak nowej linii musisz dodać go samodzielnie.

Do pliku możesz zapisać również wiele linii jednocześnie. Należy wykorzystać do tego listę napisów.

Jak widać powyżej, aby w pliku znalazły się znaki nowej linii należy dokleić je samodzielnie. Jeżeli jednak masz listę bez znaków nowej linii, możesz dodać je w ten sposób:

Tak jak pisałem wcześniej, plik otworzony w trybie “w” przy otwarciu zostaje wyczyszczony. Aby dopisać tekst na końcu pliku użyj trybu “a”.

Zamykanie pliku

Jeśli otworzysz plik to powinieneś również go zamknąć :) To dobra praktyka obsługi plików.

Służy do tego metoda close().

Co jeśli nie zamknę pliku?

Otwarty w programie plik może powodować problemy. Inne aplikacje próbujące go odczytać nie będą mogły tego zrobić.

Jeżeli korzystasz z najpopularniejszej (i domyślnej) dystrybucji CPython to nawet jeśli sam nie zamkniesz pliku to przy końcu programu zostanie on zamknięty automatycznie.

Nie każda dystrybucja jednak robi to za nas. Dobrą praktyką jest zamykanie tego samodzielnie.

Istnieje jednak inny, bardziej Pythonowy sposób, niewymagający zamykania pliku.

Obsługa plików w Pythonowy sposób

Twórcy Pythona lubią ułatwiać sobie życie jak tylko mogą. Dlatego też wprowadzono alternatywną metodę obsługi plików, która nie wymaga dodatkowego zamykania pliku.

Alternatywna metoda wymaga wykorzystania struktury with:

Jak widać po zakończonym bloku with plik został zamknięty.

Odczyt i zapis do 2 plików

Python pozwala w ten sposób otworzyć plik zarówno do zapisu, jak i odczytu:

Sprawdzanie pliku

Jak mogłeś zauważyć wyżej, próba pisania do zamkniętego pliku powoduje błąd.

Podobnie dzieje się przy próbie odczytu zamkniętego pliku, czy też zapisu do pliku nieprzeznaczonego do zapisywania.

Aby nie natrafić na błąd podczas możesz skorzystać z jednej z metod służących do sprawdzania stanu pliku.

Aby sprawdzić czy plik został zamknięty sprawdź atrybut closed().

Do sprawdzenia czy plik otwarty jest do oczytu / zapisu służą metody readable / writable.

Dodatkowe materiały

Jeśli chcesz być na bieżąco z najnowszymi materiałami, polub nasz fanpage na Facebooku:

https://www.facebook.com/kamil.kwapisz.python

Podsumowanie

Pobierz infografikę o obsłudze plików w Pythonie!

Wbudowane funkcje Pythona pozwalają pracować z plikami w sposób prosty i całkiem przyjemny.

Nie jest to oczywiście system bez wad, jednak moim zdaniem jest wystarczająco dobry :)

Potraktuj ten artykuł jako swojego rodzaju kompendium wiedzy dotyczącej obsługi plików w Pythonie. Zapisz proszę ten wpis w swoich materiałach do nauki Pythona i wracaj do niego gdy będziesz pracować z plikami :)

Nie zapomnij również wejść na stronę główną, kliknąć w okładkę dokumentu i zapisać się na newsletter w celu otrzymania dokumentu z przydatnymi bibliotekami ;)

Daj mi znać o jakich tematach w Pythonie chciałbyś dowiedzieć się więcej.

Pozdrawiam Cię bardzo serdecznie

Kamil Kwapisz

Tagged , , , , ,

About Kamil Kwapisz

Od lat zajmuję się web scrapingiem i tworzeniem aplikacji w Pythonie.
View all posts by Kamil Kwapisz →

10 thoughts on “Nauka Podstaw Pythona – obsługa plików

  1. Witam, bardzo podoba mi się Twój blog, jednak chyba znalazłem drobny błąd w tym artykule. Mianowicie w podrozdziale “Zapis do pliku” w dwóch przykładach jako znak nowej linii powinny być raczej “\n”.
    Pozdrawiam :)

    1. Tutaj sprawa się może nieco skomplikować ze względu na sposób odzielenia wyrazów od siebie :) Przy założeniu, że są one oddzielone znakami białymi problemu nie ma. Czytamy wtedy plik linia po linii, potem dzielimy linię na wyrazy:

      for line in file:
      for word in line.split():
      # …

      Jednak tutaj wchodzą również znaki interpunkcyjne. Możemy tutaj użyć np. funkcji word_tokenize z pakietu nltk.tokenize, daje to lepsze rezultaty niż zwykły split :)

  2. kiedy chce napisac skrypt do wczytywania pycharm sie burzy ze nie ma zaimportowanego filepath no to go importuje instaluje i kiedy odpalam program to mi wyrzuca błędy które dotyczą wewnetrznych funkcji filepath
    Traceback (most recent call last):
    File “D:/Programy pisane/Python/test2/main.py”, line 1, in
    import filepath
    File “D:\Programy pisane\Python\test2\venv\lib\site-packages\filepath\__init__.py”, line 5, in
    from filepath._filepath import (
    File “D:\Programy pisane\Python\test2\venv\lib\site-packages\filepath\_filepath.py”, line 179
    except WindowsError, winErrObj:
    ^
    i kiedy poprawiam to jak chce program to pojawiaja sie kolejne bledy jakies pomysly jak to naprawic?

    1. Składnia except WindowsError, winErrObj: jest składnią ze starszych wersji Pythona (z tego co widzę nawet poniżej 2.5), dlatego powyższy import nie działa na nowszych wersjach języka Python :) Do czego potrzebna Ci ta biblioteka? Bardzo możliwe że funkcje z biblioteki dostępne są w innej kompatybilnej z nowszymi wersjami :)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *