Podstawowe operacje zapisu i odczytu
Jeżeli wiesz, jak obsługiwać pliki w Pythonie, to przeskocz do kolejnego rozdziału.
Istnieje kilka sposobów na odczytanie pliku w Pythonie. Zaprezentujemy tylko jeden z nich, moim zdaniem najprostszy i najbezpieczniejszy. Oto on:
Pliki JSON
Format JSON pochodzi z języka JavaScript, ale ma bardzo dużo podobieństw do słowników, jakie są do dyspozycji w Pythonie. Słownik to coś w rodzaju tablicy, ale elementy nie mają kolejnych numerów, lecz unikalne identyfikatory zwane kluczami. Klucze mogą być liczbami, a także stringami. Ponadto wartości przypisane kluczom mogą mieć różne typy, a nawet stanowić kolejne słowniki. W ten sposób można przechowywać różnorodne informacje, zorganizowane w hierarchiczny sposób.
Nie będziemy zagłębiać się w teorię – zobaczmy od razu listing 1. Celem tego programu jest odczytanie pliku JSON i przekonwertowanie go na słownik, a następnie poproszenie użytkownika, aby na konsoli wpisał nową parę klucz-wartość. Zostanie ona dodana do słownika, a następnie przekonwertowana z powrotem na JSON i zapisana do pliku.
# Plik json_demo.py
import json # 1
data = {} # 2
def read_json(): # 3
try: # 4
with open("test.json") as file: # 5
global data # 6
data = json.load(file) # 7
except:
print("Błąd odczytu pliku test.json")
def save_json(): # 8
with open("test.json", "w") as file: # 9
json.dump(data, file, separators=(",\n", ":")) # 10
if __name__ == "__main__": # 11
read_json() # 12
key = input("Podaj nazwę nowego klucza: ") # 13
value = input("Podaj wartość nowego klucza: ") # 14
data[key] = value # 15
for key, value in data.items(): # 16
print(f"{key}:\t\t{value}")
save_json() # 17
Listing 1. Kod pliku demo_json.py
Rozpoczynamy od zaimportowania modułu json, w którym znajdują się wszystkie interesujące nas funkcje (linia 1). W linii 2 tworzymy pusty słownik o nazwie data. Co prawda nie musimy tego robić w tym miejscu, bo słownik mogłaby wygenerować funkcja odczytująca plik JSON, ale uważam, że zmienne globalne warto tworzyć na początku pliku, gdyż poprawia to czytelność kodu.
W linii 3 rozpoczynamy funkcję read_json, której zadaniem jest odczytanie pliku test.json i zapisanie go do zmiennej globalnej data. Może się zdarzyć, że taki plik jeszcze nie istnieje. Dlatego próbę odczytu powinniśmy wykonać przy pomocy bloku try-except (linia 4). W części try umieszczamy instrukcje, które mogą zakończyć się niepowodzeniem – w tym przypadku chodzi o otwarcie pliku, co do którego istnienia nie jesteśmy pewni lub którego zawartość może wcale nie być sformatowana jako JSON.
Plik otwieramy do odczytu dokładnie tak samo, jak we wcześniejszych przykładach (linia 5). W linii 6 deklarujemy, że chcemy mieć dostęp do zmiennej globalnej data. Bez tego utworzylibyśmy zmienną lokalną, która zostałaby skasowana po wyjściu z tej funkcji. Z modułu json wywołujemy funkcję load, której argumentem jest otwarty plik, a wartością zwracaną – gotowy słownik, który zapisujemy do zmiennej data (linia 7).
Kolejną funkcję stanowi save_json (linia 8). Jej zadanie polega na zapisaniu słownika do pliku test.json. Najpierw musimy otworzyć plik do zapisu (linia 9). Robimy to zupełnie normalnie, ale interesuje nas tryb „w”, aby skasować dotychczasową zawartość pliku lub utworzyć nowy, jeżeli plik o danej nazwie jeszcze nie istnieje. W linii 10 wywołujemy funkcję dump z modułu json. Pierwsze dwa argumenty funkcji to źródłowy słownik oraz plik, do którego ma być on zapisany. Trzeci argument jest opcjonalny – bez niego wszystkie wpisy słownika zostaną zapisane w pliku bez żadnego formatowania – jeden za drugim, wszystkie w jednej linijce. W tym argumencie możemy zdefiniować separatory, a „\n” oznacza znak przejścia do nowej linii po każdej parze klucz-wartość.
Przejdźmy w końcu do głównej części programu, która zaczyna się w linii 11. Najpierw wywołujemy funkcję read_json (linia 12), omówioną kilka akapitów wcześniej. Następnie program wyświetla komunikaty na konsoli, prosząc użytkownika o wprowadzenie nowego klucza i jego wartości (linia 13 i 14). W kolejnej linii dodajemy nowe dane do słownika data, po czym – za pomocą pętli for – wyświetlamy całą zawartość słownika (linia 16). Na końcu zapisujemy słownik do pamięci plików, wywołując funkcję save_json (linia 17).
Niniejszy program można wywoływać wielokrotnie, wciskając klawisz F5 w środowisku Thonny, aby zaobserwować, w jaki sposób słownik gromadzi kolejne porcje danych. Można zobaczyć je także, otwierając plik test.json bezpośrednio w edytorze Thonny.