🐍Python🐍 zajęcia 8 + zadanie

🐍Python🐍 zajęcia 8 + zadanie
Photo by David Clode / Unsplash
  • obsługa plików
    • otwieranie
    • czytanie
    • pisanie
    • zamykanie
  • biblioteki json, csv, pandas, beautifulsoup
  • 🧠update programu "książka adresowa" (teraz plik zostaje zapisany na dysku)

Rodzaje danych:

  • tekstowe
    • domyślne w pythonie,
    • Kodowane jako Unicode (np. UTF-8)
    • Pliki: .txt, .csv, .json, .xml, .html
  • binarne
    • Zawierają dane w postaci surowych bajtów (bytes).
    • jest nimi większość obrazów
    • Nieczytelne dla człowieka bez dekodowania.
    • Przykład: obrazy, pliki audio, wideo, pliki PDF, binaria.
    • Pliki: .jpg, .mp3, .exe, .bin, .pdf
  • liczbowe
  • logiczne
  • data i czas
  • strukturalne (structured data)
    • Zorganizowane w określony sposób: tabele, rekordy, JSON, XML.
    • Przykład: wiersze w tabeli SQL, obiekty JSON, pliki CSV.
  • Półstrukturalne (semi-structured data)
    • Nie mają ściśle określonej struktury, ale zawierają znaczniki/formę.
    • Przykład: JSON, XML – da się analizować, ale są elastyczne.
  • Dane niestrukturalne (unstructured data)
    • Nie mają narzuconej struktury – trudniejsze do automatycznej analizy.
    • Przykład: e-maile, dokumenty Word, obrazy, nagrania audio, wideo.

Serializacja danych to proces zamieniania obiektów Pythona (np. list, słowników, klas) na format, który można zapisać do pliku, przesłać przez sieć lub przechować, np. na JSON, XML, CSV czy binarnie (pickle). Dzięki temu dane mogą „opuścić” pamięć komputera i być użyte gdzie indziej.

Deserializacja to proces odwrotny – czyli zamienianie zapisanych danych (np. z pliku JSON) z powrotem na obiekty Pythona, z którymi możesz normalnie pracować w kodzie.

import json

# Serializacja
dane = {"imie": "Ala", "wiek": 25}
zapisane = json.dumps(dane)  # zamienia na tekst JSON

# Deserializacja
odczytane = json.loads(zapisane)  # zamienia z powrotem na dict

1. Otwieranie pliku

W Pythonie (oraz w innych językach programowania), litery r, w, a są używane jako tryby otwierania pliku (ang. file modes) w funkcji open().

file = open('nazwa_pliku.txt', 'tryb')
Tryb Opis
'r' odczyt (domyślnie) – błąd, jeśli plik nie istnieje
'w' zapis – tworzy plik lub nadpisuje
'a' dopisanie na końcu pliku
'b' tryb binarny (np. 'rb', 'wb')
'x' tworzy nowy plik – błąd, jeśli już istnieje
'r+' odczyt i zapis

📘 rread (czytaj)

      • Otwiera plik tylko do odczytu
      • Jeśli plik nie istnieje, wystąpi błąd

📖wwrite (zapisz)

      • Otwiera plik do zapisu
      • WAŻNE!!! Usuwa wszystko, co było wcześniej w pliku
      • Jeśli plik nie istnieje, zostanie utworzony

📒 aappend (dopisz)

      • Otwiera plik do dopisywania danych na końcu
      • Zachowuje istniejącą zawartość
      • Jeśli plik nie istnieje, zostanie utworzony

📌 2. Czytanie z pliku

file.read()        # czyta cały plik jako łańcuch znaków
file.readline()    # czyta jedną linię
file.readlines()   # czyta wszystkie linie do listy

📌 3. Pisanie do pliku

file.write("Tekst do zapisania")
file.writelines(["Linia 1\n", "Linia 2\n"])

📌 4. Zamknięcie pliku

file.close()
      • zastosowanie WITH (domyślnie zamyka pliki, nie zapomnieć o wcięciu w drugiej linii!!)
with open('plik.txt', 'r') as file:
    dane = file.read()

Jak sprawdzić czy plik istnieje?

os.path.exists("sciezka_do_pliku")

Biblioteki do operacji na plikach:

  • importowanie:
wpisujemy w terminalu: pip install nazwa_biblioteki
  • instalacja bibliotek - przykłady:
    • biblioteka JSON
import json
    • biblioteka CSV
import csv
  • kodowanie znaków
import json

with open("plik_z_danymi.json", encoding="utf8") as plik_json:
    zawartosc = json.load(plik_json)
  • przydatne biblioteki:
    • json -
      • służy do konwersji danych między Pythonem a formatem JSON (JavaScript Object Notation), który jest powszechnie używany do przesyłania danych, np. w API.
      • Umożliwia łatwe wczytywanie (parsowanie) danych JSON do struktur Pythona (np. dict, list) oraz zapisywanie (serializowanie) danych z Pythona do plików lub ciągów tekstowych w formacie JSON.
      • Jest częścią standardowej biblioteki Pythona, więc nie trzeba jej instalować.
      • Jej zaletą jest prostota i zgodność z powszechnie używanym, lekkim formatem wymiany danych, co czyni ją bardzo przydatną w pracy z web API, plikami konfiguracyjnymi czy aplikacjami sieciowymi.
      • dump i dumps:
        • to dwie bardzo podobne, ale różniące się funkcje z biblioteki json
        • json.dump(obj, file, ...)
          • Zapisuje (serializuje) obiekt obj bezpośrednio do pliku (file to obiekt plikowy otwarty do zapisu).
          • Używasz, gdy chcesz od razu zapisać JSON do pliku
with open("dane.json", "w") as f:
    json.dump({"imie": "Ala"}, f)
        • json.dumps(obj, ...)
          • Zwraca (serializuje) obiekt obj jako łańcuch tekstowy (string) w formacie JSON.
          • Używasz, gdy chcesz JSON najpierw przechować w zmiennej lub go np. wysłać przez sieć albo wyświetlić.
tekst_json = json.dumps({"imie": "Ala"})
print(tekst_json)  # wypisze: {"imie": "Ala"}

    • beautifoulSoup -
      • służy do parsowania i wydobywania danych z kodu HTML i XML, czyli do tzw. web scrapingu.
      • Umożliwia łatwe przeszukiwanie struktury stron internetowych, znajdowanie konkretnych elementów (np. nagłówków, linków, tabel) i pobieranie ich zawartości.
      • działa bardzo intuicyjnie – można "nawigować" po drzewie HTML jak po obiektach w Pythonie, nawet jeśli kod strony jest niechlujny lub niepoprawny.
      • Dzięki niej można zautomatyzować pobieranie danych z internetu bez konieczności korzystania z oficjalnych API.
    • Pandas -
      • służy do analizy, przetwarzania i manipulacji danymi w Pythonie – szczególnie danymi tabelarycznymi (np. jak w Excelu).
      • Umożliwia łatwe wczytywanie danych z plików (CSV, Excel, SQL), filtrowanie, grupowanie, agregowanie i tworzenie statystyk.
      • Jej niezwykłość polega na tym, że pozwala pracować z dużymi zbiorami danych w sposób szybki i zwięzły, jakby operowało się na arkuszu kalkulacyjnym – ale z mocą programowania.
      • Kluczowe obiekty, takie jak DataFrame i Series, pozwalają wygodnie reprezentować i przetwarzać dane z dowolnych źródeł.

📌Dobra praktyka:

-> jeden projekt umieszczamy w jednym folderze. Co za tym stoi:

✅ 1. Prostota importów - w pythonie importowanie plików z innych folderów (czyli pakietów) wymaga:

  • dodania __init__.py w folderze
  • albo manipulacji ścieżką (np. sys.path)
  • albo odpowiednio ustawionej zmiennej PYTHONPATH

Podsumowując : nie jest to błąd, ale duże utrudnienie

2. Środowiska uruchomieniowe (np. IDE, terminal) mogą działać różnie

Importy względne/z folderów mogą działać:

  • w PyCharm, ale nie w VSCode
  • w terminalu, ale nie w Jupyter Notebooku

Umieszczenie wszystkiego w jednym folderze eliminuje te różnice.

3. Łatwiej to zrozumieć na wczesnym etapie nauki

🔍Zadanie domowe

dopisać do pliku z książką 7 punktu dot. zapisu pliku z kontaktami

import json
import os

# Sprawdzamy czy istnieje plik z danymi i jeśli tak, zostaje otworzony, a jeśli nie istnieje, tworzymy zmienną kontakty (pusty słownik):

if os.path.exists("plik_z_danymi.json"): 
    with open("plik_z_danymi.json", "r", encoding="utf8") as plik_json:
                kontakty = json.load(plik_json)
else:
     kontakty = {}


# Wpisujemy opcje wyboru (są w pętli while, więc będą powtarzane za każdym razem kiedy warunek zostanie spełniony):
while True:
    menu = '''
Menu
    1 - dopisanie pozycji do książki
    2 - aktualizacja pozycji książki
    3 - usunięcie pozycji z książki
    4 - wydruk imion z książki
    5 - wydruk całej książki z kontaktami
    6 - koniec programu
    7 - zapisanie kontaktów
'''
    print(menu)

    wybor = int(input("Podaj numer operacji, którą chcesz wykonać: "))
    if wybor == 1:
        imie = input("Podaj imię: ")
        if imie not in kontakty:
                email = input(f"Podaj email dla kontaktu {imie}: ")
                kontakty[imie] = email
                print("Dodano kontakt.")
        else:
                print("Ta pozycja już istnieje.")
        
    elif wybor == 2:
        imie = input("Podaj imię kontaktu do aktualizacji: ")
        if imie in kontakty:
            nowy_email = input("Podaj nowy e-mail: ")
            kontakty[imie] = nowy_email 
            print("Zaktualizowano kontakt.")
        else:
            print("Nie znaleziono takiego kontaktu.")
    
    elif wybor == 3:
        imie = input("Kogo chcesz usunąć? ")
        if imie in kontakty:
            del kontakty[imie]
            print(f"Usunięto kontakt: {imie}")
        else:
            print("Nie znaleziono takiego kontaktu.")
    
    elif wybor == 4:
        for imie in kontakty:
            print(imie, end=", ")
    
    elif wybor == 5:
        print(kontakty)
    
    
    
    elif wybor == 6:
        print("Dziękuję za skorzystanie z aplikacji. ")
        break

# jeśli plik istnieje, nadpisujemy plik za każdym razem kiedy wybierzemy tą opcję (tryb "w"):

    elif wybor == 7:  
        with open("plik_z_danymi.json", "w", encoding = "utf8") as plik_json:
            json.dump(
        kontakty,
         plik_json,
        indent=4,
        sort_keys=True,
        ensure_ascii=False,
        )
            print("Zapisano książkę adresową w pliku 'plik_z_danymi'.")