Python - zajęcia 8

Python - zajęcia 8
Photo by David Clode / Unsplash

1) Znikające dane

Napotkaliśmy problem podczas pisania kodów - znikające dane. Kiedy program przestaje działać nie pamięta już danych które dodaliśmy do np, książki kontaktów.

Podstawowym sposobem przechowywanie danych jest zapisywanie ich w plikach. Są one grupowane w folderach. Całość obsługiwana jest przez system plików (np. na Windows systemem plików jest NTFS).

2) Otwieranie plików w Pythonie

W najbardziej podstawowym wariancie robimy to w ten sposób:

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

"r" - oznacza że otwieramy plik w trybie do odczytu (read), czyli nie będziemy wprowadzać do niego zmian.

Jeśli chcemy wyświetlić po kolei wiersze w danym pliku potrzebna jest pętla:

plik_zawartosc = open("mojplik.txt", "r")

for linijka in plik_zawartosc:
  print(linijka)

3) Wczytanie z możliwością edycji

"w" - (write) otwiera plik do zapisu nadpisując istniejącą jego zawartość.

"a" - (append) otwiera plik do zapisu dodając nowe dane na końcu istniejącego pliku.

W obu przypadkach jeśli plik nie istnieje to zostanie on utworzony. Możemy dodać do nazwy trybu znak +, co spowoduje, że będziemy mogli też odczytywać.

Następnie należy użyć metody .write() aby dodać zawartość.

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

.close() - kończąc pracę z plikiem należy go domknąć. Jeśli nie domkniemy pliku a aplikacja np. wysypie się na skutek jakiegoś błędu może się okazać, że straciliśmy dane.

3) "with"

Dzięki with inaczej korzystamy z plików i nie trzeba pamiętać o domykaniu.

with open("mojplik.txt", "w") as plik_zawartosc:
    plik_zawartosc.write("Nowa zawartość")
with open("mojplik.txt", "r") as plik_zawartosc:
    print(plik_zawartosc.read())

4) Rodzaje plików

.txt, .csv, .json, .md (markdown),  .py (python) to pliki tekstowe.

a) .csv - tabelka, która oddziela kolejne wiersze przecinkami, plik tekstowy

b) .json - plik tekstowy o innej strukturze

c) binarne

Niektóre pliki jednak przechowują dane w postaci binarnej (zerojedynkowej), dzięki czemu zajmują dużo mniej miejsca. Tak jest np. przy większości formatów do obrazków. Nie można ich otworzyć w notatniku. Przykładami są: .exe, .jpg, .png.

5) Formaty plików

Dobrze wiedzieć jak dane są zorganizowane. Nawet w formatach tekstowych można to zrobić w inny sposób np. zupełnie inaczej wyglądają pliki .json i .csv.

Jeśli nie wiemy jakiej zawartości się spodziewamy ciężko nam zamienić zawartość pliku na jakieś dane z których możemy skorzystać. Z pomocą przychodzą biblioteki - pomagają w serializacji/deserializacji danych.

6) Pliki JSON

with open("opole_weather.json", "r") as plik_zawartosc:
    print(type(plik_zawartosc.read()))

Pokaże jakiego typu danych się spodziewamy

a) Import modułu .json

Moduł służy do pracy z danymi w formacie JSON.

import json

b) Wczytanie JSON-a

import json

with open("opole_weather.json", "r") as plik_zawartosc:
    zawartosc = json.load(plik_zawartosc)
    print(type(zawartosc))

Parsowanie JSON (przetwarzanie) - json.load(plik_zawartosc) konwertuje zawartość pliku JSON na odpowiedni obiekt w Pythonie (np. słownik lub listę). Używamy print(type(zawartosc)) żeby wyświetlić ten typ danych.

U mnie w kodzie wyświetliły się dziwne znaczki przy znaku stopni Celsjusza, bo komputer użył złej tablicy do kodowania. Możemy mu to narzucić:

import json

with open("opole_weather.json", "r" , encoding="utf8") as plik_zawartosc:
    zawartosc = json.load(plik_zawartosc)
    print(type(zawartosc))
    print(zawartosc)

c) Zapis JSON-a

Służy do tego funkcja dump z modułu json, z trybem w.

import json

moj_slownik = {"Jan" : "tel. 67584375", "Maria" : "discord mria56"}

with open("kontakty.json", "w", encoding="utf8") as mojedane:
    json.dump(moj_slownik, mojedane)

Ten kod otwiera plik do zapisu kontakty.json w trybie do zapisu ("w"). Dane będą w formacie UTF8. Zapisuje zawartość zmiennej moj_slownik do pliku kontakty.json w formacie JSON.

8) Kodowanie znaków

Kiedy pliki mają złe kodowanie na różnych etapach dodaje się kod, który zapisze nam w odpowiednim formacie wszystko.

• przy wczytywaniu

import json

with open("opole_weather.json", "r",encoding="utf8") as plik_zawartosc:
    zawartosc = json.load(plik_zawartosc)
    print(type(zawartosc))
    print(zawartosc)

• przy zapisywaniu

import json

moj_slownik = {"Jan" : "tel. 67584375", "Maria" : "discord mria56"}
with open("kontakty.json", "w", encoding="utf8") as mojedane:
json.dump(moj_slownik, mojedane)
import json

dane = {"jabłka" : 4, "mango" : 3}
with open("plik_z_danymi.json", "w", encoding="utf8") as plik_json:
  json.dump(
    dane,
    plik_json,
    indent=4,
    sort_keys=True,
    ensure_ascii=False,
  )

9) Przydatne biblioteki

  • JSON – do obsługi plików .json
  • PyYAML – do obsługi plików .yaml
  • CSV – do tekstowego formatu dla tabelek
  • Pandas – do wszelkiej maści plików przechowujących dane "tabelkowe" i do pracy z tymi danymi

10) Pliki CSV

import csv

with open("currency.csv", encoding="utf8") as mojplik:
    tabelka = csv.reader(mojplik)
    
    print(tabelka)
    
    for wiersz in tabelka:
        print(wiersz)

Kod na początku importuje moduł csv, który pozwala na pracę z plikami w formacie CSV (Comma-Separated Values - wartości oddzielone przecinkami). Najpierw otwiera plik currency.csv w trybie odczytu ("r", jeśli nie podaliśmy to jest domyślny tryb).

tabelka = csv.reader(mojplik) - Tu zmienna tabelka przechowuje obiekt umożliwiający iterację po wierszach pliku CSV. Każdy wiersz jest przedstawiony jako lista elementów oddzielonych przecinkami.

Pętla używana jest do iteracji po wierszach for wiersz in tabelka:. Każdy wiersz jest wyświetlany za pomocą print(wiersz) jako lista wartości.

11) Frameworki