Lekcja 8 - obsługa plików (notatki)

Lekcja 8 - obsługa plików (notatki)

Pliki

Jest sporo systemów plików w zależności od tego czy mamy Windowsa, Maca czy Linuxa, niemniej przeciętny użytkownik nie zwraca na to uwagi, póki nie musi przekazać swoich plików innemu użytkownikowi np. poprzez pendriva (może wymagać sformatowania).

Także python może nam służyć do otwierania rożnego rodzaju plików, robi się to poprzez metodę open, wskazanie pliku ("nazwa_pliku") i wybranie trybu pracy nad plikiem, zgodnie ze wzorem:

nasza_nazwa = open("nazwa_pliku", "tryb")

Wyróżniamy kilka trybów pracy: "w" write gdy chcemy coś nadpisać, "r" read gdy zamierzamy tylko odczytać lub "a" append gdy dodajemy zawartość na końcu pliku. Jeśli nie podamy tego parametru python przyjmie, że tylko chcemy odczytać plik.

Ponadto musimy pamiętać, że system plików może blokować otwieranie plików gdy dany plik jest otwarty przez innego użytkownika w innym programie. Stąd korzystanie z metody close, która zamyka dany plik i zapisuje wszystkie dokonane w nim zmiany, umożliwiając innym skorzystanie z niego.

plik_zawartosc = open("mojtekst.txt", "r")
print(plik_zawartosc.read())

plik_zawartosc.close()

Na końcu musimy domknąć stąd close.

plik_zawartosc = open("mojtekst.txt", "w")
plik_zawartosc.write("Nowa zawartość")

plik_zawartosc.close()

Efektem jest usunięcie wszystkiego z pliku mojtekst.txt i zastąpienie jej przez to co następuje w nawiasie po write tj. "Nowa zawartość".


Uwaga! Przy zastosowaniu polskich znaków mogą pojawić się problemy z wyświetleniem, ponieważ różne programy mogą korzystać z różnych tablic znaków np. ASCII, UTF-8, Windows-1250. Stąd lepiej z nich, w miarę możliwości, nie korzystać lub zastosować encoding="nazwa_tablicy", żeby python wiedział z jakiej tablicy znaków korzystaliśmy tworząc dany plik:

plik_zawartosc = open("mojtekst.txt", "r", encoding="utf-8")

Gdy nie chcemy stracić zapisanych w pliku danych należy zastosować metodę append by coś do niego dopisać:

plik_zawartosc = open("mojtekst.txt", "a")
plik_zawartosc.write("Nowa zawartość")

plik_zawartosc.close()

Zauważ, że stosując metodę write i append można też tworzyć nowe pliki, wystarczy po open wpisać nazwę nowego pliku, a zostanie on utworzony w folderze docelowym.

With

Pamiętanie o stosowaniu metody close, może być kłopotliwe, rozwiązaniem tego jest zastosowanie with, zgodnie z poniższym przykładem:

with open("mojplik.txt", "r") as plik_zawartosc:
  odczytane = plik_zawartosc.read()
  print(odczytane)

W wersie z with musi pojawić się "as" (zamiast znaku równości) i zmienna, na końcu wersu dwukropek, a następny wers będzie wcięty.

Przy użyciu "with" plik zostanie prawidłowo domknięty (nie trzeba wpisywać "close()"). Dzięki temu kod jest krótszy i bardziej odporny na błędy.

Dane binarne i tekstowe

Dane z plików python automatycznie czyta jako tekst. Do plików tekstowych należą m.in. pliki z rozszerzeniami .txt, .md, .html (przeznaczone do otwierania w przeglądarkach internetowych), czy .py.

Niektóre pliki jednak przechowują dane w postaci binarnej (zerojedynkowej), dzięki czemu zajmują dużo mniej miejsca. Niestety nie można ich otworzyć w notatniku. Należą do nich pliki z rozszerzeniami typu: .exe, .com, lub przeznaczone dla obrazów jak .jpg, .png (wyjątkiem jest .svg). Jak zasygnalizować pythonowi że mamy do czynienia z takim plikiem? Należy do trybu dodać literkę "b".

with open("mojplik.txt", "rb") as plik_zawartosc:
  print(plik_zawartosc.read())

Przydatne biblioteki

Sposób w jaki dane są zorganizowane w plikach też się różnią w zależności od użytego formatu np. .json, .yaml. Dlatego, żeby sensownie wykorzystać dane, należy zasygnalizować pythonowi co chcemy z nimi zrobić. Robimy to importując biblioteki, które umożliwią nam odczytanie i zinterpretowanie danych z najbardziej popularnych plików. Do takich bibliotek należą:

JSON - do obsługi plików .json. Pliki bardzo zbliżone do słowników lub list w pythonie. Więcej o korzystaniu z biblioteki JSON w lekcji 9

import json

with open("ksiazka.json", "r") as plikjson:
  zawartosc = json.load(plikjson)
  print(zawartosc)
  print(type(zawartosc))
  #pokazuje jakiego typu jest zawartość np. string, słownik

PyYAML - do obsługi .yaml. Podobne rodzaje danych do .json, ale wygodniejszy gdy chcemy napisać np. plik konfiguracyjny dla aplikacji, ponieważ jest bardziej czytelny dla człowieka.

CSV (ang. coma seperated values) - do tekstowego formatu dla tabelek. Służy do przesyłania danych (ale nie przeniesie formuł, szczegółów formatowania itd.).

import csv

with open("currency.csv", "r", encoding="utf-8") as walutyplik:
  zawartosc = csv.reader(walutyplik)
  print(zawartosc)
  print(type(zawartosc))
  for wiersz in zawartosc:
    print(wiersz)

Python czyta CSV jako jeden string, dlatego konieczne jest odwołanie do biblioteki csv i "rozbicie" zawartości na listy.

Pandas - do wszelkiej maści plików przechowujących dane "tabelkowe" i do pracy z tymi danymi.

import pandas 

currency_df = pandas.read_csv("currency.csv")
print(currency_df)
print(type(currency_df))