Operacje na plikach

Olbrzymia większość programów używa plików do odczytania swojej konfiguracji, danych potrzebnych do działania programu, do wczytania danych użytkownika i do zapisania wyniku działania programu.

Prędzej czy później (a nawet już teraz) zajdzie potrzeba wczytania lub zapisania czegoś do pliku - program byłby do niczego jeśli dane wejściowe trzeba byłoby zapisywać bezpośrednio w kodzie programu. Mam nadzieję, że masz wystarczającą motywację żeby zaznajomić się z tym niezbędnym do dalszego rozwoju tematem. Zaczynajmy!

Pliki w pythonie można otwierać na kilka różnych sposobów. Zdania co do tego które rozwiązanie jest najlepsze są podzielone- wybierz to, które będzie najwygodniejsze lub poczytaj w innych źródłach jeśli potrzebujesz wybrać je do jakiegoś bardzo istotnego fragmentu programu.

Pierwszym i najprostszym sposobem otwarcia pliku jest użycie funkcji

plik = open('ścieżka/do/pliku.txt')

ścieżka może być bezwzględna (cała ścieżka do pliku) lub może to być ścieżka z miejsca, w którym uruchomiony jest program. Jeśli uruchamiasz program w folderze, w którym znajduje się plik wystarczy po prostu wpisać jego nazwę wraz z rozszerzeniem (to bardzo istotne żeby wpisać też rozszerzenie pliku jeśli plik takowe posiada, wyświetlanie rozszerzeń plików jest zależne od systemu operacyjnego, te informacje musisz znaleźć sam)

tak otwarty plik można przeczytać używając:

print plik.read()

po tej operacji można go już traktować jak wielolinijkowy napis. Najczęściej jednak jest to mało użyteczne, to tak jakby dać komuś ciasto do zjedzenia,  ale w całości, nie krojąc go na kawałki... Dużo lepiej jest podzielić plik na linie. Można go odczytać linijka po linijce w ten sposób:

for linia in plik:
    print linia

i tutaj spotka Cie niemiłe zaskoczenie, tekst rozłazi się bardziej niż to konieczne... dlaczego? A dlatego,  że każda linijka na końcu zawiera niewidoczny domyślnie "Enter" - znak przejścia do nowej linii, jest z nim trochę jak ze spacją, nie widać go bezpośrednio, ale bez niego plik wyglądałby dziwnie, jest to kolejny tak zwany znak biały (mówiliśmy już o spacji i tabulatorze). Tak więc polecenie "print" nie dość że samo zawsze przechodzi do nowej linii po wyświetleniu tego co miało wyświetlić, to mamy jeszcze taki "enter" zaszyty w tym napisie który wyświetlamy. Powinniśmy się go pozbyć. Można to osiągnąć metodą

linia.strip()

która to usuwa takie zbędne znaki końca linii (razem z innymi niepotrzebnymi białymi znakami).

Skoro możemy wygodnie podzielić sobie plik na linie to czemu by nie pójść krok dalej? Możemy podzielić linie na słowa! Uzyskamy to za pomocą metody split() która to z jednego długiego napisu zrobi nam listę wyrazów

tekst = "Jakis tam sobie tekst dla przykladu"
print tekst.split()

da nam listę napisów wyglądającą tak:

['Jakis', 'tam', 'sobie', 'tekst', 'dla', 'przykladu']

Co znacznie ułatwia ładowanie danych z plików do wygodnych, znanych i miejmy nadzieję lubianych przez Ciebie list.

Po tym jak skończysz "czytać" plik należy go zamknąć:

plik.close()

należy o tym pamiętać, ponieważ może się zdarzyć, że nie zamknięty plik ulegnie uszkodzeniu lub będzie blokowany gdy inny program będzie chciał mieć do niego dostęp.

Kolejną metodą jest otwarcie pliku w taki sam sposób i zastosowanie metody readlines() na nim. Zwróci nam to listę linii z jakimiś dziwnymi znaczkami. Te znaczki to nic innego jak znaki przejścia do nowej linii (\n), lub tabulatory (\t).

Innym sposobem otwarcia pliku jest użycie następującej konstrukcji

with open('plik.txt') as plik:
    for linia in plik:
        print linia.strip().split()

Dzięki temu mówimy, że chcemy wykonać coś wraz z otwarciem pliku i nie musimy przejmować się jego zamknięciem. To rozwiazanie ma też swoje wady - kiedy chcemy otworzyć w ten sposób wiele plików na raz, wcięcia w tekście robią się okropnie duże i ciężko ich pilnować. Jednakże do otwierania pojedyńczego pliku jak najbardziej warto tego używać, bo jasno widać gdzie dzieje się coś z plikiem i gdzie kończy się z nim coś dziać.

Świetnie, czytanie opanowane masz do perfekcji, ale zapewne chciałbyś też umieć coś w pliku zapisać? Niewiele to trudniejsze niż czytanie. Do pliku można zapisać dowony napis, ale uwaga, plik należy otworzyć w odpowiednim "trybie". Wcześniej otwieranie wyglądało jak poniżej, jak widzisz, pojawiła się tam dodatkowa literka 'r', nie wpisywaliśmy jej wcześniej bo jest to wartość domyślna i z powodzeniem można o niej zapomnieć jeśli zamierzamy tylko "czytać" (z angielskiego r <= read), więc jeśli chcemy "pisać" do pliku należy plik otworzyć w trybie zapisu (z angielskiego w <= write). Przykłady poniżej:

plik = open('plik.txt','r')
plik.close()
plik = open('plik.txt','w')
plik.close()

Dobrze, ale otwarcie pliku to nie wszystko, przecież trzeba wreszcie coś w nim zapisać. Robi się to bardzo prosto a mianowicie, gdy masz otwary plik w trybie zapisu możesz zapisać do niego cokolwiek co jest napisem:

plik.write(str(55552522))
plik.write("\n")
plik.write("Tutaj masz jakis napis")

Warto wspomnieć że wstawienie "Entera" robimy za pomocą "\n" a tabulację za pomocą "\t".

Po wszystkim plik należy oczywiście zamknać jeśli był otwarty pierwszą metodą.

Uwaga: kiedy otwierasz plik w trybie zapisu cała zawartość jest czyszczona bezpowrotnie!!! Pamiętaj o tym otwierając pliki. Jeśli chcesz coś dopisać na końcu istniejącego pliku,  możesz otwierać plik w trybie dopisywania (z angielskiego a <= append)

plik = open('plik.txt','a')

wtedy wszysto to co zapiszesz będzie dopisywane na końcu pliku i nie utracisz swoich danych.

Wskazówka: Kiedy otwierasz nieistniejący plik w trybie 'w' lub "a" jest on domyślnie tworzony.

Uwaga: powyższa wskazówka nie dotyczy plików w trybie odczytu ('r'), nie tworzy ona też folderów!

O plikach moglibyśmy jeszcze długo pisać (jeśli jesteś ciekaw, możesz poszukać w internecie informacji o metodach seek i rozmiarach buforów odczytu), ale z wiedzą tu przedstawioną powinieneś poradzić sobie z większością, jeśli nie wszystkimi zadaniami w serwisie.

 

Sprawdź czy potrafisz już zrobić zadanie Operacje na plikach !