W systemie operacyjnym plik składa się z kolejnych bajtów informacji. Zawsze ma swoją nazwę i jest umiejscowiony w katalogu. W zależności od systemu plikówsystem plikówsystemu plików dane te mogą mieć różne ograniczenia. Oto kilka przykładów:
system plików
ograniczenia
FAT
długość nazwy pliku nie może przekraczać 8 znaków
NTFS
bezwzględna ścieżka pliku; maksymalna długość pełnej ścieżki dostępuścieżka dostępuścieżki dostępu nie może przekraczać 260 znaków
ext4
bezwzględna ścieżka pliku; maksymalna długość pełnej ścieżki dostępu nie może przekraczać 4096 znaków
Istnieje też różnica w zapisie separatora katalogów:
system operacyjny
separator katalogów
DOS, Windows
\
Linux, UNIX, MacOS
/
Dodatkowo, w systemach istnieją także różnice w definiowaniu dysków/partycji:
system operacyjny
oznaczenie partycji
DOS, Windows
oznaczenie literowe, np. (C:, D:)
dystrybucje systemu Linux, UNIX, MacOS
To bardziej skomplikowane zagadnienie, więcej informacji znajdziesz w e‑materiałach poświęconych temu zagadnieniu.
Dla zainteresowanych
E‑materiały poświęcone dystrybucjom systemu Linux:
W programach, które mają być wieloplatformowe, zawsze należy zapisać odpowiednio ścieżki dostępu do plików. W tym celu możemy stosować metodę path() z modułu os.
W tym e‑materiale będziemy używać plików znajdujących się w tym samy katalogu co program. Dzięki temu unikniemy problemów związanych ze sposobem zapisu ścieżki dostępu w różnych systemach operacyjnych.
Ważne!
Jeśli chcemy wykonywać operacje odczytu/zapisu pliku na dysku, używamy specjalnej konstrukcji w języku Python:
Linia 1. with open otwórz nawias okrągły kropka kropka kropka zamknij nawias okrągły as plik dwukropek.
Linia 2. kratka blok kodu operacji plikowych.
with open(...) as plik:
# blok kodu operacji plikowych
Dzięki takiemu zapisowi nie musimy dbać o zamykanie pliku po operacjach odczytu/zapisu oraz uzyskujemy obiekt plik i wszystkie metody niezbędne do operacji na plikach:
Zapisywanie i odczytywanie danych tekstowych do i z pliku
Przykład 1
Zdefiniujmy funkcję zapisującą (o nazwie funkcja_zapisujaca())dane podane jako parametr do pliku tekstowego, którego nazwa będzie kolejnym parametrem. Jeśli nie podamy nazwy, funkcja przyjmie domyślną wartość plik_tekstowy.txt.
Linia 1. def funkcja podkreślnik zapisujaca otwórz nawias okrągły dane przecinek plik znak równości cudzysłów plik podkreślnik tekstowy kropka txt cudzysłów zamknij nawias okrągły dwukropek.
Linia 2. with open otwórz nawias okrągły plik przecinek cudzysłów w cudzysłów zamknij nawias okrągły as p dwukropek.
Linia 3. dlugosc znak równości p kropka write otwórz nawias okrągły str otwórz nawias okrągły dane zamknij nawias okrągły zamknij nawias okrągły.
Linia 4. return dlugosc.
Linia 6. kratka przykład wywołania.
Linia 7. bajty znak równości funkcja podkreślnik zapisujaca otwórz nawias okrągły cudzysłów To jest tekst przecinek który znajdzie się w pliku kropka cudzysłów przecinek cudzysłów nazwa podkreślnik pliku kropka txt cudzysłów zamknij nawias okrągły.
Linia 8. print otwórz nawias okrągły f cudzysłów Zapisano otwórz nawias klamrowy bajty zamknij nawias klamrowy bajtów kropka cudzysłów zamknij nawias okrągły.
Linia 9. kratka Wynik działania programu.
Linia 10. kratka Zapisano 42 bajtów kropka.
def funkcja_zapisujaca(dane, plik="plik_tekstowy.txt"):
with open(plik, "w") as p:
dlugosc = p.write(str(dane))
return dlugosc
# przykład wywołania
bajty = funkcja_zapisujaca("To jest tekst, który znajdzie się w pliku.","nazwa_pliku.txt")
print(f"Zapisano {bajty} bajtów.")
# Wynik działania programu
# Zapisano 42 bajtów.
Ważne!
W kodzie używamy drugiego parametru w metodzie open() (linia 2 open(plik, "w")). Opisujemy go w dalszej części e‑materiału.
Funkcja utworzy plik, jeśli jeszcze nie istniał, i zapisze do niego linię tekstu. Jeżeli plik istniał, zostanie nadpisany. Metoda write() zwróci 42 – liczbę znaków zapisanych do pliku, a tym samym rozmiar pliku – 42 bajty.
Oto wynik działania polecenia statstatstat w dystrybucji systemu Linux o nazwie Ubuntu (rozmiar 44 bajty wynika z użycia 2 znaków z rozszerzonego ASCII, czyli UTF‑8 (ó oraz ę), a więc 2 znaki po 2 bajty + 40 znaków po 1 bajt):
Linia 1. user at mint minus desktop dwukropek prawy ukośnik home prawy ukośnik python$ stat nazwa podkreślnik pliku kropka txt.
Linia 2. Plik dwukropek nazwa podkreślnik pliku kropka txt.
Linia 3. rozmiar dwukropek 44 bloków dwukropek 8 bloki I prawy ukośnik O dwukropek 4096 plik zwykły.
Linia 4. Urządzenie dwukropek 10301h prawy ukośnik 66305d inody dwukropek 9830915 dowiązań dwukropek 1.
Linia 5. Dostęp dwukropek otwórz nawias okrągły 0664 prawy ukośnik minus rw minus rw minus r minus minus zamknij nawias okrągły Uid dwukropek otwórz nawias okrągły 1000 prawy ukośnik user zamknij nawias okrągły Gid dwukropek otwórz nawias okrągły 1000 prawy ukośnik user zamknij nawias okrągły.
Linia 6. Dostęp dwukropek 2020 minus 01 minus 24 19 dwukropek 50 dwukropek 07 kropka 585710674 plus 0100.
Linia 7. Modyfikacja dwukropek 2020 minus 01 minus 24 19 dwukropek 50 dwukropek 07 kropka 585710674 plus 0100.
Linia 8. Zmiana dwukropek 2020 minus 01 minus 24 19 dwukropek 50 dwukropek 07 kropka 585710674 plus 0100.
Linia 9. Utworzenie dwukropek minus.
Zdjęcie przedstawia właściwości utworzonego pliku. Podświetlona jest zakładka: Podstawowe. W polu Nazwa znajduje się: nazwa_pliku.txt. Poniżej w Rodzaj znajduje się: Zwykły dokument tekstowy. Reszta informacji to: Rozmiar, położenie, wolumin, dostęp oraz zmodyfikowano.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Funkcja open() ma dwa parametry:
nazwę pliku, do którego ma nastąpić zapis lub z którego będzie następował odczyt,
tryb dostępu do pliku.
tryb
opis działania
r
tryb czytania (domyślny)
w
tryb zapisu, nadpisuje poprzedni plik, jeśli istniał
a
tryb zapisu, dopisuje na końcu pliku lub zapisuje w nowym, jeżeli plik nie istniał
b
tryb binarny
t
tryb tekstowy ASCII (domyślny)
W języku Python możemy odczytywać dane z plików, np. z plików tekstowych, za pomocą metod powiązanych z obiektem plikowym utworzonym poprzez składnię with open(...) as plik:
metoda
opis
plik.read(rozmiar_bajtow)
czyta określoną przez rozmiar_bajtow ilość danych lub cały plik, jeśli nie określimy tego parametru; zwraca obiekt typu str
plik.readline()
czyta jedną, kolejną linię z pliku; zwraca obiekt typu str
plik.readlines()
czyta cały plik, umieszczając kolejne linie jako elementy listy; zwraca obiekt typu list
Przykład 2
Sprawdźmy, jak będą działały te metody dla przykładowego pliku o nazwie plik_testowy.txt i zawartości:
Linia 1. Plik testowy dla funkcji czytającej dane kropka.
Linia 2. Zawiera więcej niż jedną linijkę tekstu kropka.
Linia 3. 357.
Linia 4. Może zawierać liczby kropka.
Plik testowy dla funkcji czytającej dane.
Zawiera więcej niż jedną linijkę tekstu.
357
Może zawierać liczby.
Przykład odczytania całego pliku przez metodę read():
Linia 1. with open otwórz nawias okrągły apostrof plik podkreślnik testowy kropka txt apostrof przecinek apostrof r apostrof zamknij nawias okrągły as plik dwukropek.
Linia 2. dane znak równości plik kropka read otwórz nawias okrągły zamknij nawias okrągły.
Linia 4. print otwórz nawias okrągły dane zamknij nawias okrągły.
Linia 5. kratka Wynik działania programu.
Linia 6. kratka Plik testowy dla funkcji czytającej dane kropka.
Linia 7. kratka Zawiera więcej niż jedną linijkę tekstu kropka.
Linia 8. kratka 357.
Linia 9. kratka Może zawierać liczby kropka.
with open('plik_testowy.txt', 'r') as plik:
dane = plik.read()
print(dane)
# Wynik działania programu
# Plik testowy dla funkcji czytającej dane.
# Zawiera więcej niż jedną linijkę tekstu.
# 357
# Może zawierać liczby.
Przykład odczytania pliku do kilku obiektów przez metodę readline():
Linia 1. with open otwórz nawias okrągły apostrof plik podkreślnik testowy kropka txt apostrof przecinek apostrof r apostrof zamknij nawias okrągły as plik dwukropek.
Linia 2. dane1 znak równości plik kropka readline otwórz nawias okrągły zamknij nawias okrągły.
Linia 3. dane2 znak równości plik kropka readline otwórz nawias okrągły zamknij nawias okrągły.
Linia 4. dane3 znak równości plik kropka readline otwórz nawias okrągły zamknij nawias okrągły.
Linia 5. dane4 znak równości plik kropka readline otwórz nawias okrągły zamknij nawias okrągły.
Linia 8. print otwórz nawias okrągły dane1 zamknij nawias okrągły.
Linia 9. kratka Wynik działania programu.
Linia 10. kratka Plik testowy dla funkcji czytającej dane kropka.
Linia 12. print otwórz nawias okrągły dane2 zamknij nawias okrągły.
Linia 13. kratka Wynik działania programu.
Linia 14. kratka Zawiera więcej niż jedną linijkę tekstu kropka.
Linia 16. print otwórz nawias okrągły dane3 zamknij nawias okrągły.
Linia 17. kratka Wynik działania programu.
Linia 18. kratka 357.
Linia 20. print otwórz nawias okrągły dane4 zamknij nawias okrągły.
Linia 21. kratka Wynik działania programu.
Linia 22. kratka Może zawierać liczby kropka.
with open('plik_testowy.txt', 'r') as plik:
dane1 = plik.readline()
dane2 = plik.readline()
dane3 = plik.readline()
dane4 = plik.readline()
print(dane1)
# Wynik działania programu
# Plik testowy dla funkcji czytającej dane.
print(dane2)
# Wynik działania programu
# Zawiera więcej niż jedną linijkę tekstu.
print(dane3)
# Wynik działania programu
# 357
print(dane4)
# Wynik działania programu
# Może zawierać liczby.
Ważne!
Każda zmienna odczytuje jedną linię wraz ze znakami końca linii. W ten sam sposób wyświetli to program.
Przykład odczytania pliku do obiektu przez metodę readlines():
Linia 1. with open otwórz nawias okrągły apostrof plik podkreślnik testowy kropka txt apostrof przecinek apostrof r apostrof zamknij nawias okrągły as plik dwukropek.
Linia 2. dane podkreślnik lista znak równości plik kropka readlines otwórz nawias okrągły zamknij nawias okrągły.
Linia 5. print otwórz nawias okrągły dane podkreślnik lista zamknij nawias okrągły.
Linia 6. otwórz nawias kwadratowy apostrof Plik testowy dla funkcji czytającej dane kropka lewy ukośnik n apostrof przecinek apostrof Zawiera więcej niż jedną linijkę tekstu kropka lewy ukośnik n apostrof przecinek apostrof 357 lewy ukośnik n apostrof przecinek apostrof Może zawierać liczby kropka lewy ukośnik n apostrof zamknij nawias kwadratowy.
Linia 8. for e in dane podkreślnik lista dwukropek.
Linia 9. print otwórz nawias okrągły e zamknij nawias okrągły.
Linia 11. kratka Wynik działania programu.
Linia 12. kratka Plik testowy dla funkcji czytającej dane kropka.
Linia 14. kratka Zawiera więcej niż jedną linijkę tekstu kropka.
Linia 16. kratka 357.
Linia 18. kratka Może zawierać liczby kropka.
with open('plik_testowy.txt', 'r') as plik:
dane_lista = plik.readlines()
print(dane_lista)
['Plik testowy dla funkcji czytającej dane.\n', 'Zawiera więcej niż jedną linijkę tekstu.\n', '357\n', 'Może zawierać liczby.\n']
for e in dane_lista:
print(e)
# Wynik działania programu
# Plik testowy dla funkcji czytającej dane.
# Zawiera więcej niż jedną linijkę tekstu.
# 357
# Może zawierać liczby.
1
Polecenie 1
Napisz program, który
zapisze w pliku tekstowym zdanie: „Pierwszy wiersz tekstu”;
otworzy zapisany plik i dopisze do niego zdanie: „Drugi wiersz dopisany”;
otworzy zapisany plik i wypisze jego zawartość.
Linia 1. print otwórz nawias okrągły cudzysłów przykład 1 cudzysłów zamknij nawias okrągły.
Linia 2. with open otwórz nawias okrągły apostrof plik podkreślnik testowy kropka txt apostrof przecinek apostrof r apostrof zamknij nawias okrągły as plik dwukropek.
Linia 3. dane podkreślnik lista znak równości plik kropka readlines otwórz nawias okrągły zamknij nawias okrągły.
Linia 5. print otwórz nawias okrągły cudzysłów przykład 2 cudzysłów zamknij nawias okrągły.
Linia 6. print otwórz nawias okrągły dane podkreślnik lista zamknij nawias okrągły.
Linia 8. print otwórz nawias okrągły cudzysłów przykład 3 cudzysłów zamknij nawias okrągły.
Linia 9. for e in dane podkreślnik lista dwukropek.
Linia 10. print otwórz nawias okrągły e zamknij nawias okrągły.
Linia 12. kratka Wynik działania programu.
Linia 13. kratka przykład 1.
Linia 14. kratka przykład 2.
Linia 15. kratka otwórz nawias kwadratowy apostrof Plik testowy dla funkcji czytającej dane kropka lewy ukośnik n apostrof przecinek apostrof Zawiera więcej niż jedną linijkę tekstu kropka lewy ukośnik n apostrof przecinek apostrof 357 lewy ukośnik n apostrof przecinek apostrof Może zawierać liczby kropka apostrof zamknij nawias kwadratowy.
Linia 16. kratka przykład 3.
Linia 17. kratka Plik testowy dla funkcji czytającej dane kropka.
Linia 19. kratka Zawiera więcej niż jedną linijkę tekstu kropka.
Linia 21. kratka 357.
Linia 23. kratka Może zawierać liczby kropka.
print("przykład 1")
with open('plik_testowy.txt', 'r') as plik:
dane_lista = plik.readlines()
print("przykład 2")
print(dane_lista)
print("przykład 3")
for e in dane_lista:
print(e)
# Wynik działania programu
# przykład 1
# przykład 2
# ['Plik testowy dla funkcji czytającej dane.\n', 'Zawiera więcej niż jedną linijkę tekstu.\n', '357\n', 'Może zawierać liczby.']
# przykład 3
# Plik testowy dla funkcji czytającej dane.
# Zawiera więcej niż jedną linijkę tekstu.
# 357
# Może zawierać liczby.
Metoda readlines() odczytuje wszystkie wiersze z pliku i zwraca je zapisane w liście. Trzeba pamiętać, że wiersze zakończone będą znakami nowego wiersza. Możliwe znaki to:
znak "\n", czyli LF (ang. line feed),
znaki "\r\n", czyli CRLF (CR, ang. carriage return).
Jeżeli plik otwieramy tak jak w podanych wcześniej przykładach, np. open(nazwa_pliku, tryb), na końcu wierszy umieszczony zostanie znak "\n" niezależnie od znaków końca wiersza w pliku. Jeżeli jednak plik otworzymy, podając dodatkowy argument newline="", np. open(nazwa_pliku, tryb, newline=""), znaki końca wiersza będą takie, jak w pliku tekstowym.
Podczas wypisywania wierszy zawierających znak LF lub CRLF dodawany jest pusty wiersz. Usunięcie znaków nowego wiersza z ciągu znakowego jest możliwe na kilka sposobów, np.:
"wiersz\n".strip(),
"wiersz\n".replace("\n", ""),
"wiersz\n".replace("\r\n", "").
Format JSON
Język Python umożliwia również łatwą obsługę plików tekstowych zapisanych w formacie JSONJSONJSON, który pozwala wymieniać dane pomiędzy różnymi językami programowania. Format ten umożliwia między innymi zapisywanie w plikach tekstowych i późniejszy odczyt złożonych struktur danych, takich jak np. listy czy słowniki. Korzystanie z formatu wymaga zaimportowania modułu json. Najważniejsze funkcje to:
funkcja
opis
dump(dane, plik)
zapisuje obiekt dane do pliku plik
load(plik)
odczytuje dane z pliku plik
Przykład 3
Zdefiniujemy funkcje pozwalające na zapisanie w pliku tekstowym listy liczb zapisanych w słowniku oraz późniejsze odczytanie tych danych.
Linia 1. import json.
Linia 2. def zapisz podkreślnik plik podkreślnik json otwórz nawias okrągły nazwa podkreślnik pliku przecinek dane zamknij nawias okrągły dwukropek.
Linia 3. cudzysłów cudzysłów cudzysłów Zapisanie do pliku tekstowego w formacie json podanych danych cudzysłów cudzysłów cudzysłów.
Linia 4. with open otwórz nawias okrągły nazwa podkreślnik pliku przecinek cudzysłów w cudzysłów zamknij nawias okrągły as p dwukropek.
Linia 5. json kropka dump otwórz nawias okrągły dane przecinek p zamknij nawias okrągły.
Linia 7. def wczytaj podkreślnik plik podkreślnik json otwórz nawias okrągły nazwa podkreślnik pliku zamknij nawias okrągły dwukropek.
Linia 8. cudzysłów cudzysłów cudzysłów Wczytanie zawartości podanego pliku tekstowego w formacie json cudzysłów cudzysłów cudzysłów.
Linia 9. try dwukropek.
Linia 10. with open otwórz nawias okrągły nazwa podkreślnik pliku przecinek cudzysłów r cudzysłów zamknij nawias okrągły as p dwukropek.
Linia 11. dane znak równości json kropka load otwórz nawias okrągły p zamknij nawias okrągły.
Linia 12. return dane.
Linia 13. except FileNotFoundError dwukropek.
Linia 14. print otwórz nawias okrągły f cudzysłów lewy ukośnik nBrak pliku otwórz nawias klamrowy nazwa podkreślnik pliku zamknij nawias klamrowy na dysku wykrzyknik lewy ukośnik n cudzysłów zamknij nawias okrągły.
Linia 16. kratka przykład wywołania.
Linia 17. nazwa podkreślnik pliku znak równości cudzysłów liczby kropka json cudzysłów.
Linia 18. slownik znak równości otwórz nawias klamrowy apostrof liczby apostrof dwukropek otwórz nawias kwadratowy 6 przecinek 2 przecinek 8 przecinek 1 przecinek 7 przecinek 0 zamknij nawias kwadratowy zamknij nawias klamrowy.
Linia 19. zapisz podkreślnik plik podkreślnik json otwórz nawias okrągły cudzysłów liczby kropka json cudzysłów przecinek slownik zamknij nawias okrągły.
Linia 20. print otwórz nawias okrągły wczytaj podkreślnik plik podkreślnik json otwórz nawias okrągły nazwa podkreślnik pliku zamknij nawias okrągły zamknij nawias okrągły.
import json
def zapisz_plik_json(nazwa_pliku, dane):
"""Zapisanie do pliku tekstowego w formacie json podanych danych"""
with open(nazwa_pliku, "w") as p:
json.dump(dane, p)
def wczytaj_plik_json(nazwa_pliku):
"""Wczytanie zawartości podanego pliku tekstowego w formacie json"""
try:
with open(nazwa_pliku, "r") as p:
dane = json.load(p)
return dane
except FileNotFoundError:
print(f"\nBrak pliku {nazwa_pliku} na dysku!\n")
# przykład wywołania
nazwa_pliku = "liczby.json"
slownik = {'liczby': [6, 2, 8, 1, 7, 0]}
zapisz_plik_json("liczby.json", slownik)
print(wczytaj_plik_json(nazwa_pliku))
Nazwy plików przechowujących dane w formacie JSON mogą, chociaż nie jest to wymagane, mieć rozszerzenie .json. Do zapisu danych w formacie JSON wykorzystujemy metodę dump() zdefiniowaną w module json, który należy zaimportować na początku programu. Metoda wymaga podania danych do zapisania (np. w postaci słownika lub listy) oraz obiektu pliku otwartego do zapisu przez funkcję open().
Odczytywanie danych polega na użyciu metody load(), która wymaga jedynie obiektu pliku otwartego do odczytu przez funkcję open(). Zwracane dane zachowują swoją strukturę, tzn. odtwarzany zostaje ich typ, np. słownik czy lista.
Ciekawostka
Pliki w formacie JSON można edytować w edytorach tekstu.
Przykładowy program
Przykład 4
Przeanalizujmy program elektronicznego dziennika klasowego inspirowanego programem przedstawionym w e‑materiale Wprowadzenie do struktur w języku PythonDKlkH5m8jWprowadzenie do struktur w języku Python). Program ilustruje użycie omówionych metod zapisu i odczytu plików tekstowych.
Program najpierw poprosi użytkownika o podanie nazwy klasy, do której należeć ma dziennik. Następnie użytkownik dodaje informacje na temat uczniów (opcja nr 1). Jeśli użytkownik spróbuje wczytać oceny osoby (opcja nr 2), nim ta zostanie dodana, program poinformuje go, że uczeń nie istnieje i wróci do menu. Po dodaniu ocen dziennik można zapisać (opcja nr 3). Jeśli zapisaliśmy wcześniej inny dziennik, możemy wczytać go w dowolnym momencie opcją nr 4.
Gdy program prosi cię o podjęcie decyzji za pomocą wybrania opcji t (skrót od tak) lub n (skrót od nie), tylko wybór t (małej litery) zatwierdzi działanie. Wszystkie inne wprowadzone znaki (również dużą literę T) program zinterpretuje jak n.
Ważne!
Poniższy program należy uruchomić, korzystając z wersji języka Python 3.10 lub wyższej, ponieważ wykorzystany w nim został operator | – wykonuje operację dodawania kluczy i wartości ze słownika.
Praca domowa
Rozbuduj program tak, by działanie można było zatwierdzić wprowadzeniem dużej litery T oraz małej litery t, natomiast odrzucić je wprowadzeniem dużej litery N oraz małej litery n. Po wprowadzeniu innego znaku program powinien prosić użytkownika o wprowadzenie poprawnej odpowiedzi. Dodatkowo zabezpiecz program przed błędnymi danymi (np. oceną spoza zakresu).
Linia 1. import json.
Linia 3. def elektroniczny podkreślnik dziennik podkreślnik klasowy otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 5. PRZEDMIOTY znak równości otwórz nawias kwadratowy cudzysłów matematyka cudzysłów przecinek cudzysłów polski cudzysłów przecinek cudzysłów informatyka cudzysłów przecinek cudzysłów fizyka cudzysłów zamknij nawias kwadratowy.
Linia 6. KLASA znak równości otwórz nawias klamrowy zamknij nawias klamrowy.
Linia 8. def zapisz podkreślnik dziennik otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 9. cudzysłów cudzysłów cudzysłów Przygotowanie danych klasy do zapisania w pliku tekstowym cudzysłów cudzysłów cudzysłów.
Linia 10. dane podkreślnik txt znak równości apostrof apostrof.
Linia 11. for nr in KLASA dwukropek.
Linia 12. if isinstance otwórz nawias okrągły nr przecinek int zamknij nawias okrągły dwukropek.
Linia 13. dane podkreślnik txt plus znak równości str otwórz nawias okrągły nr zamknij nawias okrągły plus cudzysłów dwukropek cudzysłów plus KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy otwórz nawias kwadratowy cudzysłów imie podkreślnik nazwisko cudzysłów zamknij nawias kwadratowy plus cudzysłów lewy ukośnik n cudzysłów.
Linia 14. if not KLASA otwórz nawias kwadratowy apostrof zapisana apostrof zamknij nawias kwadratowy dwukropek.
Linia 15. zapisz podkreślnik oceny otwórz nawias okrągły nr zamknij nawias okrągły.
Linia 16. if not dane podkreślnik txt dwukropek.
Linia 17. print otwórz nawias okrągły cudzysłów Brak danych do zapisania wykrzyknik lewy ukośnik n cudzysłów zamknij nawias okrągły.
Linia 18. elif KLASA otwórz nawias kwadratowy apostrof zapisana apostrof zamknij nawias kwadratowy dwukropek.
Linia 19. print otwórz nawias okrągły cudzysłów Dziennik jest już zapisany kropka cudzysłów zamknij nawias okrągły.
Linia 20. else dwukropek.
Linia 21. zapisz podkreślnik plik podkreślnik txt otwórz nawias okrągły KLASA otwórz nawias kwadratowy cudzysłów baza podkreślnik klasy cudzysłów zamknij nawias kwadratowy przecinek dane podkreślnik txt zamknij nawias okrągły.
Linia 22. print otwórz nawias okrągły cudzysłów Zapisano dziennik klasy cudzysłów przecinek KLASA otwórz nawias kwadratowy cudzysłów klasa cudzysłów zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 23. KLASA otwórz nawias kwadratowy apostrof zapisana apostrof zamknij nawias kwadratowy znak równości True.
Linia 25. def zapisz podkreślnik plik podkreślnik txt otwórz nawias okrągły nazwa podkreślnik pliku przecinek dane podkreślnik txt zamknij nawias okrągły dwukropek.
Linia 26. cudzysłów cudzysłów cudzysłów Zapisanie do pliku tekstowego podanych danych cudzysłów cudzysłów cudzysłów.
Linia 27. with open otwórz nawias okrągły nazwa podkreślnik pliku przecinek cudzysłów w cudzysłów zamknij nawias okrągły as p dwukropek.
Linia 28. p kropka write otwórz nawias okrągły dane podkreślnik txt zamknij nawias okrągły.
Linia 30. def zapisz podkreślnik oceny otwórz nawias okrągły nr zamknij nawias okrągły dwukropek.
Linia 31. cudzysłów cudzysłów cudzysłów Przygotowanie ocen do zapisania w pliku tekstowym w formacie json cudzysłów cudzysłów cudzysłów.
Linia 32. oceny znak równości otwórz nawias klamrowy zamknij nawias klamrowy.
Linia 33. for przedmiot in PRZEDMIOTY dwukropek.
Linia 34. oceny otwórz nawias kwadratowy przedmiot zamknij nawias kwadratowy znak równości KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy otwórz nawias kwadratowy przedmiot zamknij nawias kwadratowy.
Linia 36. nazwa podkreślnik pliku znak równości cudzysłów podkreślnik cudzysłów kropka join otwórz nawias okrągły otwórz nawias kwadratowy KLASA otwórz nawias kwadratowy cudzysłów klasa cudzysłów zamknij nawias kwadratowy przecinek str otwórz nawias okrągły nr zamknij nawias okrągły przecinek KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy otwórz nawias kwadratowy cudzysłów imie podkreślnik nazwisko cudzysłów zamknij nawias kwadratowy kropka replace otwórz nawias okrągły cudzysłów cudzysłów przecinek cudzysłów podkreślnik cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy zamknij nawias okrągły plus cudzysłów kropka json cudzysłów.
Linia 37. zapisz podkreślnik plik podkreślnik json otwórz nawias okrągły nazwa podkreślnik pliku przecinek oceny zamknij nawias okrągły.
Linia 38. print otwórz nawias okrągły f cudzysłów Oceny osoby nr otwórz nawias klamrowy nr zamknij nawias klamrowy zapisano w pliku dwukropek otwórz nawias klamrowy nazwa podkreślnik pliku zamknij nawias klamrowy cudzysłów zamknij nawias okrągły.
Linia 40. def zapisz podkreślnik plik podkreślnik json otwórz nawias okrągły nazwa podkreślnik pliku przecinek dane zamknij nawias okrągły dwukropek.
Linia 41. cudzysłów cudzysłów cudzysłów Zapisanie do pliku tekstowego w formacie json podanych danych cudzysłów cudzysłów cudzysłów.
Linia 42. with open otwórz nawias okrągły nazwa podkreślnik pliku przecinek cudzysłów w cudzysłów zamknij nawias okrągły as p dwukropek.
Linia 43. json kropka dump otwórz nawias okrągły dane przecinek p zamknij nawias okrągły.
Linia 45. def wczytaj podkreślnik dziennik otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 46. cudzysłów cudzysłów cudzysłów Wczytanie danych klasy do słownika KLASA cudzysłów cudzysłów cudzysłów.
Linia 47. KLASA kropka clear otwórz nawias okrągły zamknij nawias okrągły.
Linia 48. KLASA otwórz nawias kwadratowy cudzysłów klasa cudzysłów zamknij nawias kwadratowy znak równości input otwórz nawias okrągły cudzysłów Podaj nazwę klasy otwórz nawias okrągły np kropka 1A zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły.
Linia 49. while not KLASA otwórz nawias kwadratowy cudzysłów klasa cudzysłów zamknij nawias kwadratowy dwukropek.
Linia 50. KLASA otwórz nawias kwadratowy cudzysłów klasa cudzysłów zamknij nawias kwadratowy znak równości input otwórz nawias okrągły cudzysłów Podaj nazwę klasy otwórz nawias okrągły np kropka 1A zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły.
Linia 51. KLASA otwórz nawias kwadratowy cudzysłów baza podkreślnik klasy cudzysłów zamknij nawias kwadratowy znak równości cudzysłów edziennik podkreślnik cudzysłów plus KLASA otwórz nawias kwadratowy cudzysłów klasa cudzysłów zamknij nawias kwadratowy plus cudzysłów kropka txt cudzysłów.
Linia 52. wiersze znak równości wczytaj podkreślnik plik podkreślnik txt otwórz nawias okrągły KLASA otwórz nawias kwadratowy cudzysłów baza podkreślnik klasy cudzysłów zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 53. if wiersze dwukropek.
Linia 54. for wiersz in wiersze dwukropek.
Linia 55. osoba znak równości otwórz nawias klamrowy zamknij nawias klamrowy.
Linia 56. nr przecinek nazwisko znak równości wiersz kropka strip otwórz nawias okrągły zamknij nawias okrągły kropka split otwórz nawias okrągły apostrof dwukropek apostrof zamknij nawias okrągły.
Linia 57. osoba otwórz nawias kwadratowy cudzysłów nr cudzysłów zamknij nawias kwadratowy znak równości int otwórz nawias okrągły nr zamknij nawias okrągły.
Linia 58. osoba otwórz nawias kwadratowy cudzysłów imie podkreślnik nazwisko cudzysłów zamknij nawias kwadratowy znak równości nazwisko.
Linia 59. KLASA otwórz nawias kwadratowy osoba otwórz nawias kwadratowy cudzysłów nr cudzysłów zamknij nawias kwadratowy zamknij nawias kwadratowy znak równości osoba.
Linia 60. wczytaj podkreślnik oceny otwórz nawias okrągły osoba otwórz nawias kwadratowy apostrof nr apostrof zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 61. print otwórz nawias okrągły f cudzysłów Wczytano dane osoby nr otwórz nawias klamrowy nr zamknij nawias klamrowy dwukropek otwórz nawias klamrowy nazwisko zamknij nawias klamrowy cudzysłów zamknij nawias okrągły.
Linia 62. KLASA otwórz nawias kwadratowy apostrof zapisana apostrof zamknij nawias kwadratowy znak równości True.
Linia 64. def wczytaj podkreślnik plik podkreślnik txt otwórz nawias okrągły nazwa podkreślnik pliku zamknij nawias okrągły dwukropek.
Linia 65. cudzysłów cudzysłów cudzysłów Wczytanie zawartości podanego pliku tekstowego cudzysłów cudzysłów cudzysłów.
Linia 66. try dwukropek.
Linia 67. with open otwórz nawias okrągły nazwa podkreślnik pliku przecinek cudzysłów r cudzysłów zamknij nawias okrągły as p dwukropek.
Linia 68. tresc znak równości p kropka readlines otwórz nawias okrągły zamknij nawias okrągły.
Linia 69. return tresc.
Linia 70. except FileNotFoundError dwukropek.
Linia 71. print otwórz nawias okrągły f cudzysłów lewy ukośnik nBrak pliku otwórz nawias klamrowy nazwa podkreślnik pliku zamknij nawias klamrowy na dysku wykrzyknik lewy ukośnik n cudzysłów zamknij nawias okrągły.
Linia 73. def wczytaj podkreślnik oceny otwórz nawias okrągły nr zamknij nawias okrągły dwukropek.
Linia 74. cudzysłów cudzysłów cudzysłów Wczytanie ocen z pliku tekstowego w formacie json do słownika KLASA cudzysłów cudzysłów cudzysłów.
Linia 75. nazwa podkreślnik pliku znak równości cudzysłów podkreślnik cudzysłów kropka join otwórz nawias okrągły otwórz nawias kwadratowy KLASA otwórz nawias kwadratowy cudzysłów klasa cudzysłów zamknij nawias kwadratowy przecinek str otwórz nawias okrągły nr zamknij nawias okrągły przecinek KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy otwórz nawias kwadratowy cudzysłów imie podkreślnik nazwisko cudzysłów zamknij nawias kwadratowy kropka replace otwórz nawias okrągły cudzysłów cudzysłów przecinek cudzysłów podkreślnik cudzysłów zamknij nawias okrągły zamknij nawias kwadratowy zamknij nawias okrągły plus cudzysłów kropka json cudzysłów.
Linia 76. oceny znak równości wczytaj podkreślnik plik podkreślnik json otwórz nawias okrągły nazwa podkreślnik pliku zamknij nawias okrągły.
Linia 77. if oceny dwukropek.
Linia 78. KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy znak równości KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy kreska pionowa oceny.
Linia 79. else dwukropek.
Linia 80. print otwórz nawias okrągły f cudzysłów Brak ocen dla osoby nr otwórz nawias klamrowy nr zamknij nawias klamrowy kropka cudzysłów zamknij nawias okrągły.
Linia 82. def wczytaj podkreślnik plik podkreślnik json otwórz nawias okrągły nazwa podkreślnik pliku zamknij nawias okrągły dwukropek.
Linia 83. cudzysłów cudzysłów cudzysłów Wczytanie zawartości podanego pliku tekstowego w formacie json cudzysłów cudzysłów cudzysłów.
Linia 84. try dwukropek.
Linia 85. with open otwórz nawias okrągły nazwa podkreślnik pliku przecinek cudzysłów r cudzysłów zamknij nawias okrągły as p dwukropek.
Linia 86. dane znak równości json kropka load otwórz nawias okrągły p zamknij nawias okrągły.
Linia 87. return dane.
Linia 88. except FileNotFoundError dwukropek.
Linia 89. print otwórz nawias okrągły f cudzysłów lewy ukośnik nBrak pliku otwórz nawias klamrowy nazwa podkreślnik pliku zamknij nawias klamrowy na dysku wykrzyknik lewy ukośnik n cudzysłów zamknij nawias okrągły.
Linia 91. def pobierz podkreślnik numer otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 92. cudzysłów cudzysłów cudzysłów Pobranie numeru osoby cudzysłów cudzysłów cudzysłów.
Linia 93. nr znak równości input otwórz nawias okrągły cudzysłów Podaj nr w dzienniku dwukropek cudzysłów zamknij nawias okrągły.
Linia 94. if not nr kropka isdigit otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 95. print otwórz nawias okrągły f cudzysłów Podany nr otwórz nawias klamrowy nr zamknij nawias klamrowy nie jest liczbą wykrzyknik cudzysłów zamknij nawias okrągły.
Linia 96. return.
Linia 97. return int otwórz nawias okrągły nr zamknij nawias okrągły.
Linia 99. def pobierz podkreślnik dane otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 100. cudzysłów cudzysłów cudzysłów Pobranie danych osoby cudzysłów cudzysłów cudzysłów.
Linia 101. nr znak równości pobierz podkreślnik numer otwórz nawias okrągły zamknij nawias okrągły.
Linia 102. if not nr dwukropek.
Linia 103. return.
Linia 104. if nr not in KLASA dwukropek.
Linia 105. print otwórz nawias okrągły f cudzysłów Brak danych dla osoby nr otwórz nawias klamrowy nr zamknij nawias klamrowy wykrzyknik cudzysłów zamknij nawias okrągły.
Linia 106. if input otwórz nawias okrągły f cudzysłów Podasz dane osoby nr otwórz nawias klamrowy nr zamknij nawias klamrowy otwórz nawias okrągły t prawy ukośnik n zamknij nawias okrągły znak zapytania cudzysłów zamknij nawias okrągły znak równości znak równości cudzysłów t cudzysłów dwukropek.
Linia 107. osoba znak równości otwórz nawias klamrowy zamknij nawias klamrowy.
Linia 108. osoba otwórz nawias kwadratowy cudzysłów nr cudzysłów zamknij nawias kwadratowy znak równości nr.
Linia 109. osoba otwórz nawias kwadratowy cudzysłów imie podkreślnik nazwisko cudzysłów zamknij nawias kwadratowy znak równości input otwórz nawias okrągły cudzysłów Podaj imię i nazwisko dwukropek cudzysłów zamknij nawias okrągły.
Linia 110. for przedmiot in PRZEDMIOTY dwukropek.
Linia 111. osoba otwórz nawias kwadratowy przedmiot zamknij nawias kwadratowy znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy.
Linia 112. KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy znak równości osoba.
Linia 113. else dwukropek.
Linia 114. return 0.
Linia 116. return nr.
Linia 118. def dodaj podkreślnik ocene otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 119. cudzysłów cudzysłów cudzysłów Dodaje ocenę z przedmiotu cudzysłów cudzysłów cudzysłów.
Linia 120. nr znak równości pobierz podkreślnik dane otwórz nawias okrągły zamknij nawias okrągły.
Linia 121. if not nr dwukropek.
Linia 122. return None.
Linia 124. print otwórz nawias okrągły f cudzysłów Możliwe przedmioty to dwukropek otwórz nawias klamrowy PRZEDMIOTY zamknij nawias klamrowy kropka cudzysłów zamknij nawias okrągły.
Linia 125. przedmiot znak równości input otwórz nawias okrągły cudzysłów Podaj nazwę przedmiotu dwukropek cudzysłów zamknij nawias okrągły.
Linia 127. kratka sprawdzamy przecinek czy podany przedmiot jest nauczany w klasie.
Linia 128. if przedmiot in PRZEDMIOTY dwukropek.
Linia 129. kratka pobieramy i dodajemy ocenę.
Linia 130. ocena znak równości int otwórz nawias okrągły input otwórz nawias okrągły cudzysłów Podaj ocenę otwórz nawias okrągły 1 minus 6 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły zamknij nawias okrągły.
Linia 131. KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy otwórz nawias kwadratowy przedmiot zamknij nawias kwadratowy kropka append otwórz nawias okrągły ocena zamknij nawias okrągły.
Linia 132. print otwórz nawias okrągły cudzysłów Ocenę dodano do dziennika kropka cudzysłów zamknij nawias okrągły.
Linia 133. KLASA otwórz nawias kwadratowy apostrof zapisana apostrof zamknij nawias kwadratowy znak równości False.
Linia 134. else dwukropek.
Linia 135. print otwórz nawias okrągły f cudzysłów Brak przedmiotu otwórz nawias klamrowy przedmiot zamknij nawias klamrowy w klasie kropka cudzysłów zamknij nawias okrągły.
Linia 137. def wypisz podkreślnik oceny otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 138. cudzysłów cudzysłów cudzysłów Wypisuje oceny cudzysłów cudzysłów cudzysłów.
Linia 139. nr znak równości pobierz podkreślnik numer otwórz nawias okrągły zamknij nawias okrągły.
Linia 140. if not nr dwukropek.
Linia 141. return.
Linia 143. if nr not in KLASA dwukropek.
Linia 144. print otwórz nawias okrągły f cudzysłów Brak danych dla osoby nr otwórz nawias klamrowy nr zamknij nawias klamrowy kropka cudzysłów zamknij nawias okrągły.
Linia 145. return.
Linia 147. print otwórz nawias okrągły f cudzysłów Oceny osoby nr otwórz nawias klamrowy nr zamknij nawias klamrowy dwukropek cudzysłów zamknij nawias okrągły.
Linia 148. for przedmiot in PRZEDMIOTY dwukropek.
Linia 149. kratka sprawdzamy przecinek czy dana osoba ma oceny z podanego przedmiotu.
Linia 150. if len otwórz nawias okrągły KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy otwórz nawias kwadratowy przedmiot zamknij nawias kwadratowy zamknij nawias okrągły dwukropek.
Linia 151. print otwórz nawias okrągły f cudzysłów otwórz nawias klamrowy przedmiot zamknij nawias klamrowy dwukropek otwórz nawias klamrowy KLASA otwórz nawias kwadratowy nr zamknij nawias kwadratowy otwórz nawias kwadratowy przedmiot zamknij nawias kwadratowy zamknij nawias klamrowy cudzysłów zamknij nawias okrągły.
Linia 152. else dwukropek.
Linia 153. print otwórz nawias okrągły f cudzysłów otwórz nawias klamrowy przedmiot zamknij nawias klamrowy dwukropek brak ocen cudzysłów zamknij nawias okrągły.
Linia 155. def menu podkreślnik programu otwórz nawias okrągły zamknij nawias okrągły dwukropek.
Linia 156. cudzysłów cudzysłów cudzysłów Menu główne cudzysłów cudzysłów cudzysłów.
Linia 158. menu znak równości cudzysłów cudzysłów cudzysłów minus minus minus minus minus minus minus minus minus minus minus minus minus.
Linia 159. MENU GŁÓWNE dwukropek.
Linia 160. 1 minus Dodaj ocenę osobie.
Linia 161. 2 minus Pokaż oceny osoby.
Linia 162. 3 minus Zapisz dziennik.
Linia 163. 4 minus Wczytaj dziennik.
Linia 164. 5 minus Koniec.
Linia 165. cudzysłów cudzysłów cudzysłów.
Linia 166. print otwórz nawias okrągły menu zamknij nawias okrągły.
Linia 167. opcja znak równości input otwórz nawias okrągły cudzysłów Wybierz opcję dwukropek cudzysłów zamknij nawias okrągły.
Linia 168. print otwórz nawias okrągły zamknij nawias okrągły.
Linia 170. if not opcja kropka isdigit otwórz nawias okrągły zamknij nawias okrągły or not otwórz nawias okrągły 0 otwórz nawias ostrokątny int otwórz nawias okrągły opcja zamknij nawias okrągły otwórz nawias ostrokątny 6 zamknij nawias okrągły dwukropek.
Linia 171. print otwórz nawias okrągły f cudzysłów Błędna opcja otwórz nawias klamrowy opcja zamknij nawias klamrowy wykrzyknik cudzysłów zamknij nawias okrągły.
Linia 172. return 0.
Linia 173. return int otwórz nawias okrągły opcja zamknij nawias okrągły.
Linia 175. wczytaj podkreślnik dziennik otwórz nawias okrągły zamknij nawias okrągły.
Linia 176. kratka główna pętla programu.
Linia 177. wybrana podkreślnik opcja znak równości 0.
Linia 178. while wybrana podkreślnik opcja wykrzyknik znak równości 5 dwukropek.
Linia 179. wybrana podkreślnik opcja znak równości menu podkreślnik programu otwórz nawias okrągły zamknij nawias okrągły.
Linia 180. if wybrana podkreślnik opcja znak równości znak równości 1 dwukropek.
Linia 181. dodaj podkreślnik ocene otwórz nawias okrągły zamknij nawias okrągły.
Linia 182. if wybrana podkreślnik opcja znak równości znak równości 2 dwukropek.
Linia 183. wypisz podkreślnik oceny otwórz nawias okrągły zamknij nawias okrągły.
Linia 184. if wybrana podkreślnik opcja znak równości znak równości 3 dwukropek.
Linia 185. zapisz podkreślnik dziennik otwórz nawias okrągły zamknij nawias okrągły.
Linia 186. if wybrana podkreślnik opcja znak równości znak równości 4 dwukropek.
Linia 187. zapisz podkreślnik dziennik otwórz nawias okrągły zamknij nawias okrągły.
Linia 188. wczytaj podkreślnik dziennik otwórz nawias okrągły zamknij nawias okrągły.
Linia 189. else dwukropek.
Linia 190. zapisz podkreślnik dziennik otwórz nawias okrągły zamknij nawias okrągły.
Linia 191. print otwórz nawias okrągły cudzysłów Koniec programu kropka cudzysłów zamknij nawias okrągły.
Linia 193. elektroniczny podkreślnik dziennik podkreślnik klasowy otwórz nawias okrągły zamknij nawias okrągły.
import json
def elektroniczny_dziennik_klasowy():
PRZEDMIOTY = ["matematyka", "polski", "informatyka", "fizyka"]
KLASA = {}
def zapisz_dziennik():
"""Przygotowanie danych klasy do zapisania w pliku tekstowym"""
dane_txt = ''
for nr in KLASA:
if isinstance(nr, int):
dane_txt += str(nr) + ":" + KLASA[nr]["imie_nazwisko"] + "\n"
if not KLASA['zapisana']:
zapisz_oceny(nr)
if not dane_txt:
print("Brak danych do zapisania!\n")
elif KLASA['zapisana']:
print("Dziennik jest już zapisany.")
else:
zapisz_plik_txt(KLASA["baza_klasy"], dane_txt)
print("Zapisano dziennik klasy", KLASA["klasa"])
KLASA['zapisana'] = True
def zapisz_plik_txt(nazwa_pliku, dane_txt):
"""Zapisanie do pliku tekstowego podanych danych"""
with open(nazwa_pliku, "w") as p:
p.write(dane_txt)
def zapisz_oceny(nr):
"""Przygotowanie ocen do zapisania w pliku tekstowym w formacie json"""
oceny = {}
for przedmiot in PRZEDMIOTY:
oceny[przedmiot] = KLASA[nr][przedmiot]
nazwa_pliku = "_".join([KLASA["klasa"], str(nr), KLASA[nr]["imie_nazwisko"].replace(" ","_")]) + ".json"
zapisz_plik_json(nazwa_pliku, oceny)
print(f"Oceny osoby nr {nr} zapisano w pliku: {nazwa_pliku}")
def zapisz_plik_json(nazwa_pliku, dane):
"""Zapisanie do pliku tekstowego w formacie json podanych danych"""
with open(nazwa_pliku, "w") as p:
json.dump(dane, p)
def wczytaj_dziennik():
"""Wczytanie danych klasy do słownika KLASA"""
KLASA.clear()
KLASA["klasa"] = input("Podaj nazwę klasy (np. 1A): ")
while not KLASA["klasa"]:
KLASA["klasa"] = input("Podaj nazwę klasy (np. 1A): ")
KLASA["baza_klasy"] = "edziennik_" + KLASA["klasa"] + ".txt"
wiersze = wczytaj_plik_txt(KLASA["baza_klasy"])
if wiersze:
for wiersz in wiersze:
osoba = {}
nr, nazwisko = wiersz.strip().split(':')
osoba["nr"] = int(nr)
osoba["imie_nazwisko"] = nazwisko
KLASA[osoba["nr"]] = osoba
wczytaj_oceny(osoba['nr'])
print(f"Wczytano dane osoby nr {nr}: {nazwisko}")
KLASA['zapisana'] = True
def wczytaj_plik_txt(nazwa_pliku):
"""Wczytanie zawartości podanego pliku tekstowego"""
try:
with open(nazwa_pliku, "r") as p:
tresc = p.readlines()
return tresc
except FileNotFoundError:
print(f"\nBrak pliku {nazwa_pliku} na dysku!\n")
def wczytaj_oceny(nr):
"""Wczytanie ocen z pliku tekstowego w formacie json do słownika KLASA"""
nazwa_pliku = "_".join([KLASA["klasa"], str(nr), KLASA[nr]["imie_nazwisko"].replace(" ","_")]) + ".json"
oceny = wczytaj_plik_json(nazwa_pliku)
if oceny:
KLASA[nr] = KLASA[nr] | oceny
else:
print(f"Brak ocen dla osoby nr {nr}.")
def wczytaj_plik_json(nazwa_pliku):
"""Wczytanie zawartości podanego pliku tekstowego w formacie json"""
try:
with open(nazwa_pliku, "r") as p:
dane = json.load(p)
return dane
except FileNotFoundError:
print(f"\nBrak pliku {nazwa_pliku} na dysku!\n")
def pobierz_numer():
"""Pobranie numeru osoby"""
nr = input("Podaj nr w dzienniku: ")
if not nr.isdigit():
print(f"Podany nr {nr} nie jest liczbą!")
return
return int(nr)
def pobierz_dane():
"""Pobranie danych osoby"""
nr = pobierz_numer()
if not nr:
return
if nr not in KLASA:
print(f"Brak danych dla osoby nr {nr}!")
if input(f"Podasz dane osoby nr {nr} (t/n)? ") == "t":
osoba = {}
osoba["nr"] = nr
osoba["imie_nazwisko"] = input("Podaj imię i nazwisko: ")
for przedmiot in PRZEDMIOTY:
osoba[przedmiot] = []
KLASA[nr] = osoba
else:
return 0
return nr
def dodaj_ocene():
"""Dodaje ocenę z przedmiotu"""
nr = pobierz_dane()
if not nr:
return None
print(f"Możliwe przedmioty to: {PRZEDMIOTY}.")
przedmiot = input("Podaj nazwę przedmiotu: ")
# sprawdzamy, czy podany przedmiot jest nauczany w klasie
if przedmiot in PRZEDMIOTY:
# pobieramy i dodajemy ocenę
ocena = int(input("Podaj ocenę (1-6): "))
KLASA[nr][przedmiot].append(ocena)
print("Ocenę dodano do dziennika.")
KLASA['zapisana'] = False
else:
print(f"Brak przedmiotu {przedmiot} w klasie.")
def wypisz_oceny():
"""Wypisuje oceny"""
nr = pobierz_numer()
if not nr:
return
if nr not in KLASA:
print(f"Brak danych dla osoby nr {nr}.")
return
print(f"Oceny osoby nr {nr}:")
for przedmiot in PRZEDMIOTY:
# sprawdzamy, czy dana osoba ma oceny z podanego przedmiotu
if len(KLASA[nr][przedmiot]):
print(f"{przedmiot}: {KLASA[nr][przedmiot]}")
else:
print(f"{przedmiot}: brak ocen")
def menu_programu():
"""Menu główne"""
menu = """-------------
MENU GŁÓWNE:
1 - Dodaj ocenę osobie
2 - Pokaż oceny osoby
3 - Zapisz dziennik
4 - Wczytaj dziennik
5 - Koniec
"""
print(menu)
opcja = input("Wybierz opcję: ")
print()
if not opcja.isdigit() or not (0 < int(opcja) < 6):
print(f"Błędna opcja {opcja}!")
return 0
return int(opcja)
wczytaj_dziennik()
# główna pętla programu
wybrana_opcja = 0
while wybrana_opcja != 5:
wybrana_opcja = menu_programu()
if wybrana_opcja == 1:
dodaj_ocene()
if wybrana_opcja == 2:
wypisz_oceny()
if wybrana_opcja == 3:
zapisz_dziennik()
if wybrana_opcja == 4:
zapisz_dziennik()
wczytaj_dziennik()
else:
zapisz_dziennik()
print("Koniec programu.")
elektroniczny_dziennik_klasowy()
W programie użyto słownika KLASA jako głównej struktury danych przechowującej informacje o klasie, między innymi nazwę klasy oraz dane uczniów. Dane te również zapisywane są w słownikach i obejmują numer ucznia pełniący rolę identyfikatora, imię i nazwisko oraz oceny z przedmiotów. Te ostatnie zapisywane są w listach. Przedmioty, z których można wpisywać oceny, zapisane zostały w liście PRZEDMIOTY.
Program wyposażono w możliwość odczytywania i zapisywania danych.
Zapisywanie danych
Informacje o klasie zapisywane są w pliku o przykładowej nazwie edziennik_1A.txt, gdzie 1A to nazwa klasy. Dane do zapisu w postaci ciągu znaków przygotowywane są przez funkcję zapisz_dziennik(). Zawierają one numery oraz imiona i nazwiska uczniów oddzielone znakiem dwukropka w osobnych wierszach, np.:
Linia 1. 1 dwukropek Adam Woźniak.
Linia 2. 2 dwukropek Oliwia Nowak.
Linia 3. 3 dwukropek Ewa Zając.
1:Adam Woźniak
2:Oliwia Nowak
3:Ewa Zając
Do zapisania przygotowanych danych w pliku tekstowym wykorzystywana jest funkcja zapisz_plik_txt() wymagająca dwóch argumentów: nazwy pliku oraz danych w postaci ciągu znaków. Funkcja ta ilustruje użycie metody write().
W funkcji zapisz_dziennik() dla każdego ucznia, którego dane i oceny dodano do słownika KLASA, wywoływana jest funkcja zapisz_oceny() otrzymująca jako argument numer ucznia. Funkcja ta przygotowuje do zapisu oceny ucznia w postaci słownika, np.:
Oceny uczniów zapisywane są do plików tekstowych w formacie JSONJSONJSON o przykładowej nazwie 1A_1_Adam_Woźniak.json, gdzie 1A to nazwa klasy, a 1 to numer ucznia. Zadanie to realizuje funkcja zapisz_plik_json() przy użyciu metody dump() z modułu json.
Odczytywanie danych
Po uruchomieniu programu lub później po wybraniu polecenia Wczytaj dziennik wywoływana jest funkcja wczytaj_dziennik(), która pobiera nazwę klasy. Jeżeli ją podamy, wywołana zostanie funkcja wczytaj_plik_txt() – jej zadaniem jest odczytanie całej zawartości pliku przy użyciu metody readlines().
Zwrócona zawartość przetwarzana jest dalej w pętli for wiersz po wierszu. Instrukcja nr, nazwisko = wiersz.strip().split(':') usuwa z wierszy znak końca wiersza, rozbija wiersz (używając znaku dwukropka jako separatora) na dwuelementową listę i wreszcie odczytuje z niej numer oraz imię i nazwisko ucznia. Dalej tworzony jest słownik z danymi ucznia i wywoływana jest funkcja wczytaj_oceny(), która jako argument otrzymuje numer ucznia.
Odczytywanie ocen realizuje funkcja wczytaj_plik_json() wykorzystując metodę load() z modułu json do wczytania danych z podanego jako argument pliku. Dane zwrócone do funkcji wczytaj_oceny() zostają zapisane w słowniku oceny, który w instrukcji KLASA[nr] = KLASA[nr] | oceny jest dołączany do słownika KLASA.
W funkcjach odczytujących: wczytaj_plik_txt() i wczytaj_plik_json() – zastosowano konstrukcję try ... except ..., aby przechwycić i obsłużyć wyjątek FileNotFoundError, który generowany jest w przypadku braku podanego pliku na dysku.
Zapisywanie i odczytywanie danych binarnych do i z pliku
Python udostępnia też moduł o nazwie pickle, który służy do zapisu danych binarnych. Jest to zapis specyficzny dla języka Python i nie jest kompatybilnykompatybilnykompatybilny z innymi językami programowania. Najważniejsze funkcje tego modułu to:
funkcja
opis
dump(dane, plik)
zapisuje obiekt dane do pliku plik
load(plik)
odczytuje dane z pliku plik
Sprawdźmy, jak możemy zapisywać dane w postaci binarnej, nie tylko sam tekst. Zdefiniujmy obiekt typu list i zapiszmy go do pliku plik_danych.bin.
Linia 1. import pickle.
Linia 2. lista znak równości otwórz nawias kwadratowy apostrof tekst apostrof przecinek True przecinek 123 kropka 54 zamknij nawias kwadratowy.
Linia 4. with open otwórz nawias okrągły apostrof plik podkreślnik danych kropka bin apostrof przecinek apostrof wb apostrof zamknij nawias okrągły as plik dwukropek.
Linia 5. pickle kropka dump otwórz nawias okrągły lista przecinek plik zamknij nawias okrągły.
import pickle
lista = [ 'tekst', True, 123.54 ]
with open('plik_danych.bin', 'wb') as plik:
pickle.dump(lista, plik)
Plik plik_danych.bin nie jest zwykłym plikiem tekstowym. Do jego utworzenia używamy opcji 'wb' funkcji open(), która oznacza zapis pliku w formacie binarnym. Jego zawartość możemy zobaczyć w specjalnym edytorze do plików binarnych.
R1SA4VIdMmut0
Zdjęcie przedstawia zawartość pliku w specjalnym edytorze do plików binarnych. Znajduje się nim zawartość zapisana systemem szesnastkowym Poniżej wypisane są wartości dla każdego z systemów zapisu.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Odczytanie danych z takiego pliku pozwala zobaczyć wartości w postaci obiektu w języku Python.
Linia 1. import pickle.
Linia 2. with open otwórz nawias okrągły apostrof plik podkreślnik danych kropka bin apostrof przecinek apostrof rb apostrof zamknij nawias okrągły as q dwukropek.
Linia 3. dane podkreślnik listy znak równości pickle kropka load otwórz nawias okrągły q zamknij nawias okrągły.
Linia 6. print otwórz nawias okrągły dane podkreślnik listy zamknij nawias okrągły.
Linia 7. kratka Wynik działania programu.
Linia 8. kratka otwórz nawias kwadratowy apostrof tekst apostrof przecinek True przecinek 123 kropka 54 zamknij nawias kwadratowy.
Linia 9. print otwórz nawias okrągły type otwórz nawias okrągły dane podkreślnik listy zamknij nawias okrągły zamknij nawias okrągły.
Linia 10. kratka Wynik działania programu.
Linia 11. kratka otwórz nawias ostrokątny class apostrof list apostrof zamknij nawias ostrokątny.
import pickle
with open('plik_danych.bin', 'rb') as q:
dane_listy = pickle.load(q)
print(dane_listy)
# Wynik działania programu
# ['tekst', True, 123.54]
print(type(dane_listy))
# Wynik działania programu
# < class 'list'>
1
Polecenie 2
Napisz program, który do listy dane doda dwa ciągi znakowe: „Pierwsze zdanie” oraz „Drugie zdanie”. Następnie program powinien zapisać listę w pliku przy użyciu modułu pickle. Na końcu odczytaj zawartość pliku do obiektu o wybranej nazwie, wypisz zawartość obiektu oraz jego typ.
Linia 1. import pickle.
Linia 2. dane znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy.
Linia 3. dane kropka append otwórz nawias okrągły apostrof Pierwsze zdanie kropka apostrof zamknij nawias okrągły.
Linia 4. dane kropka append otwórz nawias okrągły apostrof Drugie zdanie kropka apostrof zamknij nawias okrągły.
Linia 6. with open otwórz nawias okrągły apostrof nowy podkreślnik plik kropka bin apostrof przecinek apostrof wb apostrof zamknij nawias okrągły as f dwukropek.
Linia 7. pickle kropka dump otwórz nawias okrągły dane przecinek f zamknij nawias okrągły.
Linia 9. with open otwórz nawias okrągły apostrof nowy podkreślnik plik kropka bin apostrof przecinek apostrof rb apostrof zamknij nawias okrągły as f dwukropek.
Linia 10. dane znak równości pickle kropka load otwórz nawias okrągły f zamknij nawias okrągły.
Linia 12. print otwórz nawias okrągły dane zamknij nawias okrągły.
Linia 13. print otwórz nawias okrągły type otwórz nawias okrągły dane zamknij nawias okrągły zamknij nawias okrągły.
Linia 15. kratka Wynik działania programu.
Linia 16. kratka otwórz nawias kwadratowy apostrof Pierwsze zdanie kropka apostrof przecinek apostrof Drugie zdanie kropka apostrof zamknij nawias kwadratowy.
Linia 17. kratka otwórz nawias ostrokątny class apostrof list apostrof zamknij nawias ostrokątny.
import pickle
dane = []
dane.append('Pierwsze zdanie.')
dane.append('Drugie zdanie.')
with open('nowy_plik.bin', 'wb') as f:
pickle.dump(dane,f)
with open('nowy_plik.bin', 'rb') as f:
dane = pickle.load(f)
print(dane)
print(type(dane))
# Wynik działania programu
# ['Pierwsze zdanie.', 'Drugie zdanie.']
# <class 'list'>
Już wiesz
Podsumujmy najważniejsze wiadomości:
Python daje kilka możliwości zapisu i odczytu danych.
Dane można zapisywać do plików tekstowych w trybie nadpisywania lub dopisywania.
Python zawiera wbudowany moduł pickle przeznaczony do binarnego zapisywania i odczytywania obiektów tego języka.
Słownik
ASCII
ASCII
(ang. American Standard Code for Information Interchange) system kodowania znaków oparty na 7 bitach, zawiera kody liczbowe od 0 do 127 przyporządkowane m.in. znakom specjalnym, literom alfabetu łacińskiego, cyfrom czy znakom przestankowym; rozszerzany później przez systemy 8‑bitowe, np. ISO 8859‑2, Windows‑1250, współcześnie zastąpiony standardem UTF‑8
dane binarne
dane binarne
dane, które są fizyczną reprezentacją różnych obiektów, np. zdjęć czy muzyki; oglądane bezpośrednio przez człowieka nie pokazują realnej zawartości
JSON
JSON
ang. JavaScript Object Notation, tekstowy format wymiany danych obsługiwany przez wiele języków, pozwala między innymi na zapisywanie złożonych struktur danych takich jak listy czy słowniki w plikach tekstowych
kompatybilny
kompatybilny
zgodny, taki, który może być stosowany w różnych środowiskach
stat
stat
polecenie w systemach Linux, które wyświetla dokładne informacje na temat pliku lub systemu plików, takie jak np. rozmiar, typ pliku, prawa dostępu, czas ostatniego dostępu, modyfikacji, zmiany i utworzenia.
system plików
system plików
sposób organizacji zapisu plików na dysku komputera w systemie operacyjnym
ścieżka dostępu
ścieżka dostępu
dokładna lokalizacja pliku w strukturze katalogów wraz z nazwą, np: C:\Users\Python\Plik.txt lub /home/python/plik.txt.