Dział II

Pliki i Formatowanie

Bez wczytania danych nie zdasz matury. Naucz się bezpiecznie otwierać pliki, czyścić linie i poprawnie zapisywać wyniki w Pythonie.

Wstęp: Bilet wstępu na maturę praktyczną

Każde zadanie programistyczne na maturze zaczyna się od pliku dane.txt, a kończy na pliku wyniki.txt. Niezależnie od tego, jak genialny algorytm wymyślisz, jeśli nie potrafisz wczytać do niego danych wejściowych, otrzymasz 0 punktów. Ten moduł to absolutna "świętość maturalna" – schemat, który musisz napisać bezbłędnie w każdym zadaniu.

1

Bezpieczne otwieranie plików (with open)

W Pythonie pliki można otwierać na kilka sposobów, ale na maturze używamy wyłącznie konstrukcji with open(). Dlaczego? Ponieważ gwarantuje ona, że plik zostanie automatycznie zamknięty po zakończeniu pracy, nawet jeśli w Twoim programie wystąpi błąd.

Uniwersalny Schemat Otwarcia

with open("dane.txt", "r") as plik:
    # Tutaj wykonujesz wszystkie operacje na pliku
    linie = plik.readlines()

# Po wyjściu z bloku 'with' plik jest już bezpiecznie zamknięty.

Argument "r" (read) oznacza tryb tylko do odczytu. Jest on domyślny, ale warto go wpisywać dla jasności kodu.

2

Parsowanie i czyszczenie danych: .strip() i .split()

Surowe dane z pliku tekstowego rzadko nadają się do bezpośredniego użycia w obliczeniach. Zazwyczaj są "zanieczyszczone" niewidocznymi znakami sterującymi lub wymagają podziału na mniejsze fragmenty. Opanowanie metod .strip() i .split() to fundament higieny pracy z danymi.

Metoda .strip() – Walka z niewidocznym wrogiem

Każdy wiersz tekstu w pliku dane.txt kończy się znakiem \n (newline). Choć go nie widzisz, dla komputera "123\n" to nie to samo co liczba 123.

  • .strip() – usuwa białe znaki (spacje, tabulatory, \n) z obu stron stringa.
  • .lstrip() / .rstrip() – usuwa znaki tylko z lewej (left) lub prawej (right) strony.

linia = " 2026\n "
wynik = linia.strip()
print(len(wynik)) # Zwróci 4, a nie 9!

Metoda .split() – Dzielenie i rządzenie

Jeśli w jednej linii masz zapisane np. trzy liczby 10 20 30, Python widzi je jako jeden tekst. Musisz je "rozciąć" na osobne elementy listy.

  • Domyślnie .split() dzieli tekst wszędzie tam, gdzie znajdzie spację.
  • Możesz podać własny separator, np. .split(";") dla plików CSV.

dane = "10;20;30"
lista = dane.split(";")
# lista = ["10", "20", "30"]

Kombo Maturalne: Rozpakowywanie (Unpacking)
Bardzo często w zadaniach CKE każda linia zawiera dokładnie dwie lub trzy wartości (np. współrzędne X i Y). Zamiast bawić się w indeksy lista[0], lista[1], użyj tzw. rozpakowywania:

# Przykładowa linia w pliku: "450 600\n"
for linia in plik:
    x, y = linia.strip().split()
    x, y = int(x), int(y)
    # Teraz masz gotowe dwie zmienne liczbowe do obliczeń!

🚧
Najczęstszy błąd na egzaminie

Uczniowie często zapominają o kolejności. Najpierw wykonujemy .strip(), aby usunąć znak nowej linii, a dopiero potem .split(). Jeśli zrobisz to odwrotnie na bardzo nietypowych danych, \n może zostać przyklejone do ostatniego elementu Twojej listy, co uniemożliwi zamianę tego elementu na liczbę (ValueError).

3

Zapisywanie odpowiedzi (wyniki.txt)

Gdy Twój program wyliczy już wszystkie odpowiedzi, musisz je zapisać do pliku. Używamy trybu "w" (write). Pamiętaj, że .write() przyjmuje tylko tekst, więc liczby musisz rzutować przez str().

odp1 = 125
odp2 = "TAK"

with open("wyniki.txt", "w") as out:
    out.write("Zadanie 1: " + str(odp1) + "\n")
    out.write("Zadanie 2: " + odp2 + "\n")

Wskazówka: Dodawanie "\n" na końcu każdego zapisu gwarantuje, że wyniki będą w osobnych liniach, co jest wymagane przez klucz CKE.

4

Zapisywanie: Tryby 'w' i 'a' oraz formatowanie odpowiedzi

Wyliczenie poprawnego wyniku to tylko połowa sukcesu. Na maturze musisz zapisać odpowiedzi do pliku wyniki.txt w sposób czytelny dla egzaminatora. Błąd w trybie otwarcia pliku może sprawić, że nadpiszesz swoje poprzednie odpowiedzi, tracąc punkty za wcześniejsze podpunkty zadania.

Tryb "w" (Write) – Nadpisywanie

Otwiera plik do zapisu. Uwaga: jeśli plik już istnieje, jego zawartość zostanie całkowicie usunięta przed zapisem nowych danych. Jeśli plik nie istnieje, zostanie utworzony.

Najlepiej używać go tylko raz, na samym początku programu, aby "wyczyścić" plik z wynikami z poprzednich uruchomień.

Tryb "a" (Append) – Dopisywanie

Otwiera plik do dopisywania. Nowe dane zostaną dodane na samym końcu pliku, nie niszcząc tego, co już się w nim znajduje.

Idealny do dopisywania wyników kolejnych podpunktów zadania (np. 6.1, 6.2, 6.3) w miarę ich obliczania.

Poprawne formatowanie odpowiedzi

Metoda .write() przyjmuje wyłącznie stringi. Aby zapisać wynik liczbowy lub listę, musisz zamienić je na tekst. Najbardziej eleganckim i najszybszym sposobem na maturze są tzw. f-stringi.

Przykład profesjonalnego zapisu:

liczba_pierwsza = 104729
ile_par = 15

with open("wyniki.txt", "w") as f:
    # Użycie f-stringa: f"tekst {zmienna}"
    f.write(f"Zadanie 6.1: {liczba_pierwsza}\n")
    f.write(f"Zadanie 6.2: Liczba znalezionych par to {ile_par}\n")

Znaki nowej linii (\n)

Metoda write() nie dodaje automatycznie nowej linii. Jeśli o tym zapomnisz, wszystkie Twoje wyniki zleją się w jeden nieczytelny ciąg znaków. Zawsze kończ stringa znakiem \n.

Konwersja str()

Jeśli nie używasz f-stringów, pamiętaj o rzutowaniu: f.write(str(wynik)). Próba zapisania samego int spowoduje błąd TypeError i przerwanie programu.

💡
Wskazówka: Zapisywanie list

Gdy musisz zapisać długą listę wyników (np. wszystkie znalezione anagramy) w jednej linii oddzielone spacją, użyj metody join:

wyniki = ["kod", "dok", "odk"]
f.write(" ".join(wyniki) + "\n")

Pliki opanowane?

Teraz potrafisz już bezpiecznie "rozmawiać" z danymi maturalnymi. Kolejnym krokiem jest nauka ich przechowywania w pamięci za pomocą list, słowników i zbiorów.

Przejdź do Quziu