Lekcja 8- pliki

Lekcja 8- pliki
Photo by Wesley Tingey / Unsplash

Polecenia wiersza poleceń cmd:

np. cd C:\Users\Gabriel\Documents>cd Eliza przechodzi do folderu Eliza

czyli C:\Users\Gabriel\Documents\Eliza

dir wyświetla zawartość folderu w którym się znajdujemy w wierszu poleceń, np. C:\Users\Gabriel\Documents\Eliza wyświetli zawartość folderu Eliza

mkdir utworzy folder w danej ścieżce:

np. C:\Users\Gabriel\Documents>mkdir Eliza utworzy folder Eliza

cd.. wróci o 1 folder do góry, czyli np. z C:\Users\Gabriel\Documents\Eliza do

C:\Users\Gabriel\Documents

cd..\.. wróci o 2 foldery do góry, czyli z: C:\Users\Gabriel\Documents\Eliza do

C:\Users\Gabriel

więcej poleceń dla cmd na [1], różne są dla PowerShella, Basha w Linuxie itd

Różne przemyślenia:

.docx to plik binarny, nie tekstowy!
tryb instruje Pythona co chcesz zrobić z danymi, "r" to tylko odczyt, "w" nadpisanie pliku, "a" dopisanie nowej treści do ostatnich danych
zamykamy pliki funkcją .close(), żeby nie stracić danych albo otwieramy przez with... as...
Tworzymy plik w tym samym folderze co mamy program, inaczej musimy podać ścieżkę
Python zawiera wiele bibliotek dedykowanych dla różnych rodzajów plików, trzeba je zaimportować poleceniem import, np. import pandas, json, csv, PyAML
Python domyślnie otwiera pliki w trybie tekstowym string
JSON przypomina słownik Pythonowy, YAML, CSV - wartości oddzielone przecinkami (wyglądają jak tabelki)
os.path.exists() sprawdza czy plik istnieje
indent przy zrzucaniu pliku do JSON oznacza ilość wcięć (spacji), sort_keys = True sortuje po kluczach
Dzięki użyciu pętli możemy odczytać plik linijka po linijce

Kod do książki telefonicznej, zapis i odczyt formatu .json (do poprawy, nie wczytuje jeśli w książce jest więcej niż jedna pozycja):

# ten wariant jest do początkowych zajęć
# gdy osoby uczące się nie wiedzą jeszcze
# jak deklarować własne funkcje
# ... chociaż nie wytrzymałem i dodałem
# własną funkcję do czyszczenia ekranu

from os import system, name
import json
# from pprint import pprint

def czysc_ekran():
    if name == "nt":
        _ = system("cls")
    else:
        _ = system("clear")


# Przyjmijmy prosty schemat wpisu do ksiazki:
# klucz to ciąg znaków imienia (string)
# - jak ktoś wpisze imie i nazwisko też będzie ok ,
# wartością będzie lista z nr. tel (string) i opisem (string)
ksiazka_tele = {}

czysc_ekran()

while True:
    # Zapytanie o wybranie operacji
    operacja = input(
        "Wybierz operację do wykonania:\n\
                  1 - dopisanie pozycji do książki\n\
                  2 - aktualizacja pozycji książki\n\
                  3 - usunięcie pozycji książki\n\
                  4 - wydruk imion z książki\n\
                  5 - wydruk całej książki telefonicznej\n\
                  6 - zapisz dane książki do pliku json\n\
                  7 - wczytaj dane książki z pliku json\n\
                  8 - koniec programu\nPodaj kod operacji = "
    )

    if not operacja:
        break

    # Wykonanie wybranej operacji
    if operacja == "1":
        czysc_ekran()
        print("Wybrano 1")
        imie = input("Podaj imię: ")
        dane_kontaktowe = input("Wpisz dane kontaktowe: ")
        ksiazka_tele[imie] = dane_kontaktowe

    elif operacja == "2":
        czysc_ekran()
        # Wypadałoby dodać sprawdzenie czy wpis istnije
        # i robić zmiany tylko jeśli tak.
        # Bez tego ta opcja jest niemal identyczna z 1
        # - jeśli wpis nie istnieje zostanie zrobiony nowy
        print("Wybrano 2")
        imie = input("Podaj imię : ")
        dane_kontaktowe = input("Podaj zaktualizowany dane kontaktowe: ")
        ksiazka_tele[imie] = dane_kontaktowe

    elif operacja == "3":
        czysc_ekran()
        print("Wybrano 3")
        imie = input("Podaj imię do usunięcia: ")
        ksiazka_tele.pop(imie)

    elif operacja == "4":
        czysc_ekran()
        print("Wybrano 4")
        print("**********************")
        for klucz in ksiazka_tele:
            print(klucz)
        print("**********************")

    elif operacja == "5":
        czysc_ekran()
        print("Wybrano 5")
        print("**********************")
        for klucz, wpis in ksiazka_tele.items():
            print(f"Imie: {klucz}")
            print(f"wpis: {wpis}")
            print("**********************")

    # brakuje 2 opcji - zapisz json/ wczytaj json
    # dziala zapisz, wczytaj nie działa, jeśli w książce jest więcej niż 1 wpis
    elif operacja == "6":
        czysc_ekran()
        print("Wybrano 6")        
        with open("ksiazka.json", "a+") as plik_json: 
            json.dump(ksiazka_tele, plik_json, indent=2, sort_keys=True)
            
#nie działa jak w słowniku jest więcej niż 1 pozycja
#błąd to prawdopodobnie to, że każda pozycja to nowy słownik, trzeba by było złączyć słowniki w ksiazce jako jeden słownik {}
    elif operacja == "7": 
        czysc_ekran()
        print("Wybrano 7")
        with open("ksiazka.json", "r+") as plik_json:
            ksiazka_tele = json.load(plik_json)
            print(ksiazka_tele)
    
    elif operacja == "8":
        break

    else:
        print("\nBłędny kod operacji")


# Koniec programu
print("\nKoniec programu")