Pliki

Z poziomu pythona, możemy odczytywać, tworzyć, a także usuwać pliki znajdujące się na komputerze.

Konstrukcja with open(...) as ...

Do pracy z plikami będziemy używać nowej konstrukcji with open(...) as ....

Dla przykładu, stwórzmy sobie w folderze projektu plik dane.txt i zapiszmy w nim losowy tekst

Ala ma kota

Teraz w pliku pythona odczytamy jego zawartość

with open("./dane.txt") as file:
    print(file.read())

Python, do zmiennej file przypisał plik ze ścieżki ./dane.txt i później w print odczytał całą jego zawartość za pomocą metody read().

Ważną rzeczą jest to, że poza konstrukcją with, nie mamy dostępu do tego pliku. Po wykonaniu operacji, python sam zamyka dostęp do pliku i usuwa zmienną.

Zapisywanie danych do pliku

W funkcji open() możemy podać drugi argument. Będzie to tryb odczytu pliku. Jeśli ustawimy go na "w", to będziemy mogli zapisywać dane do pliku.

UWAGA! Ten tryb usuwa wszystkie istniejące dane w pliku. Aby dopisać nowe dane, musimy wybrać tryb "a".

Przy otwarciu pliku w trybie w lub a nie możemy odczytywać z niego danych.

with open("./dane.txt", "w") as file:
    file.write("Nowe dane")

Po otwarciu pliku dane.txt powinniśmy w nim zobaczyć napis Nowe dane, a stara zawartość pliku powinna zostać usunięta.

with open("./dane.txt", "a") as file:
    file.write("Dopisane dane")

Po wykonaniu tego kodu, do pliku dane.txt powinien się dopisać tekst Dopisane dane zaraz po wcześniejszej zawartości pliku.

Jednoczesny odczyt i zapis danych do pliku

W sytuacji, kiedy chcemy jednocześnie odczytywać i zapisywać dane do pliku, do wybranego trybu odczytu pliku dopisujemy +

Warto pamiętać, że python zapisuje dane podobnie jak zwykły użytkownik. Po zapisie danych, kursor znajduje się na końcu pliku. Dlatego, kiedy chcemy odczytać dane po ich zapisie, musimy cofnąć kursor na początek pliku. Przyda się tutaj metoda seek

with open("./dane.txt", "r+") as file:
    print(file.read()) # Odczytujemy cały plik, kursor na końcu pliku
    file.write("
Dane po odczytaniu") # Dopisujemy w nowej linijce dane
    file.seek(0) # Cofamy kursor na start (zerowy znak w pliku)
    print(file.read()) # Odczytujemy ponownie plik

Warto zauważyć, że wybrałem tryb "r+", a nie na przykład "w+", albo "a+". To ze względu na pozycję kursora po otwarciu pliku.

Różnice pomiędzy trybami otwarcia pliku

Tryb odczytu "r"

Tryb zapisu "w"

Tryb zapisu "a"

Po dodaniu "+", każdy z tych trybów ma możliwość zarówno zapisu jak i odczytu danych z pliku. Różnica polega wtedy głównie na pozycji kursora po otwarciu pliku.

Odczyt pliku linijka po linijce

Czasem może się zdarzyć tak, że będziemy chcieli odczytać plik linijka po linijce zamiast całości. Aby to zrobić, użyjemy metody readlines().

Stwórzmy plik osoby.txt i wrzućmy do niego poniższe dane

Janek
Maciek
Piotrek
Wojtek
Ania

Teraz odczytajmy je w pythonie

with open("./osoby.txt", "r") as file:
    for line in file.readlines():
        print("Imię: ", line.strip())

Metoda readlines() zwraca listę, więc do przejrzenia linijek użyłem pętli for. Przy wyświetlaniu użyłem metody strip(), aby usunąć znaki nowej linii, a tym samym puste linijki z konsoli.