Lekcja 8- pliki
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")