Python_Notatki Z8

Python_Notatki Z8
Photo by Maximalfocus / Unsplash

Piszemy książkę kontaktową, korzystając z plików .json i td.

Tryb do odczytu - "r"

Aby odczytać zawartość, trzeba użyć wbudowanej metody .read()

Można użyć pętli dla przejścia linijka po linijce w dok tekstowym

Przejście do kolejnej linijki jest też znakiem, nie tylko spacja, więc pojawiają się puste linijki przy wydruku w pętli.

Otwieranie plików:

plik_zawartosc = open("mojplik.txt")
# print(plik_zawartosc.read())

for linijka in plik_zawartosc:
    print(linijka, end="")
    print("***")
    

"w" - tryb do zapisu. W tym trybie znacznik jest na początku pliku i nadpisuję wszystko, co tam było, zamieniając na nową zawartość.

"a" - tryb append (do dodawania czegoś do pliku). W tym trybie znacznik jest od razu na końcu pliku i nie nadpisuje zawartości.

Dodajemy coś do pliku (tryby "w" i "a"):

# plik_zawartosc = open("mojplik.txt")
# # print(plik_zawartosc.read())

# for linijka in plik_zawartosc:
#     print(linijka, end="")
#     print("***")
    
# plik_zawartosc.close()


# plik_zawartosc = open("mojplik.txt", "w")
# plik_zawartosc.write("Nowa zawartosc.")


plik_zawartosc = open("mojplik.txt", "a")
plik_zawartosc.write("\nNowa zawartosc")
plik_zawartosc.close()

Ma problem z polskimi znakami i zapisuje je jako romby z pytaniami. Żeby nie mieć tego problemu trzeba podawać, w jakiej tabeli kodujemy (utf-8).

Jest sensowniejsza i lepsza metoda otwierania plików, kiedy nie trzeba pamiętać o ich zamykaniu .close()

kontekst manager with:

with open("mojplik.txt", "r") as plik_zawartosc:
    print(plik_zawartosc.read())

.csv jest plikiem tekstowym

Rozszerzenie nie określa, czy plik jest binarny, czy tekstowy. Najlepiej to sprawdzić otwierając w notatniku plik.

Format tekstowy zajmuje dużo miejsca, więcej niż binarny.

Binarny to 0 i 1, człowiek nie odczyta tego jako tekstu, ani tego nie otworzy domyślnie VS code.

.txt .csv .json .yaml .md(markdown), .py — formaty tekstowe

Binarne — zdjęciaa, fimy, 3d i td.

svg — tekstowy format do grafiki

csv — kolumny podzielone przecinkiem, wiersze — nowa linijka

Od formatu zależy głównie, jak są ustrukturyzowane dane w środku pliku tekstowego. Każdy ma swoje formatowanie.

.json — nawiasy do rozdzielenia linijek i td.

.json podobny do słownika w python, ale nie jest identyczny. True i False są inaczej kodowane w json niż w python.

.yaml — trochę inaczej niż w json. Trochę przyjaźniejszy dla odczytu przez ludzi.

Plik trzeba zamienić na słownik pythonowy (czy liste) i dopiero wtedy można na tych danych działać sensownie w python.

Python nie widzi w pliku swoich struktur danych, to tylko to jest string dla niego. Trzeba użyć biblioteki do odpowiedniego formatu, żeby przekształcić string w pythonową strukturę danych.

Używamy gotowych bibliotek dla serializacji i deserializacji danych. To jest zamiana pliku na pythonowe struktury i z powrotem.

Większość aplikacji internetowych komunikuje się za pomocą json.

import json   
 
with open("sw_starships.json", "r") as plik_zawartosc:
    zawartosc = json.load(plik_zawartosc)
    print(type(zawartosc))
    print(zawartosc)

Plugin, żeby nie wpisywać nazwy pliku, żeby się nie pomylić istnieje, ale trzeba zrobić własny research.

json.dump(1 pozycja - co wrzucam, 2 - dokąd)

dump — to metoda do wrzucenia danych do pliku. load — do odczytywania. dumps i loads to inne metody, nie mylić!

Jeżeli w folderze nie ma pliku z taką nazwą, to Python stworzy taki plik (przy trybie "w", w trybie "r" wyda error).

json i słownik nie są identyczne.

W json true jest z malej litery, i mimo że subtelna, ale ważna różnica to jest.

Parametr do formatowania danych w json: indent = int

indent =2 — wcięcia , i każde wcięcie to 2 spacji, jeżeli podajemy znaczenie 2.

Przyjęło się ze w json wcięcia są 2-spacjowe. Nie muszą być.

ansible — narzędzie do zarządzania serwerami. yaml — przyjaźniejszy do konfiguracji.

.xml — przypomina html, przed json-em stworzony, ciut inny. Dobrze ustandaryzowany, urzędy go lubią.

.xlsx — binarny, word też. Oszukany plik binarny, bo excel to zzipowany folder z xml-ami. zmienic ręcznie rozszerzenie na zip i można zobaczyć co tam w środku

Pliki csv:

Jeśli nie musimy, nie korzystamy z csv, bo to są duże tabele raczej do analizy, bawienie się w inżyniera danych..... Jest niewygodna raczej. Biblioteka pandas jest lepsza do pracy z csv, wczytują pliki csv. od razu zamieniają csv na ramkę danych.

import csv

with open("currency.csv", encoding="utf8") as mojplik:
    tabelka = csv.reader(mojplik)
    
    # print(tabelka)
    
    for wiersz in tabelka:
        print(wiersz)

ctrl + strzalka!!!! ctrl+enter - nowa linijka i inne skróty klawiszowe 😄

Ważne do zapisywania do json - ensure_ascii = False. Wtedy na pewno zapiszę z wykorzystaniem podanej tabeli kodowania znaków.

pandas — biblioteka do analityki danych i inżynierii danych

nympy - biblioteka do danych też.

as pd tak się przyjęło

pandas operuje na data frame (df)

pandas wyświetla tylko początek i koniec tabelki w terminalu, bo drukowanie to bez sensu

Tak można wydrukować całą tabelę, ale to rzadko jest potrzebne:

import pandas as pd

currency_df = pd.read_csv("currency.csv")
print(currency_df)

Na ostatnich zajęciach dostaniemy rekomendacje książek.

folder wyżej ".."

Jedna kropka "." to ten folder, w którym jesteśmy

To wszystko to — Obsługa systemu plików. Poczytaj więcej.

Sprawdzić, czy plik istnieje

Biblioteka os:

Tu robimy dodatkowe funkcje do książki telefonicznej z zapisywaniem do pliku json i odczytywaniem pliku json z kontaktami:

    elif operacja == "7":
        with open("ksiazka.json", "r", encoding="utf8") as moja_ksiazka:
            do_wydruku = json.load(moja_ksiazka)
            print(do_wydruku)
        
        
    elif operacja == "8":
        if os.path.exists("ksiazka.json"):
            print("Uważaj, twoj plik z ksiazka zostanie nadpisany!!!")
            with open("ksiazka.json", "w", encoding="utf8") as moja_ksiazka:
                json.dump(ksiazka_tele, moja_ksiazka, indent = 2, ensure_ascii = False)
            print("Twoja książka zapisana") 

Tak wygląda rozwiązanie Przemka:

Dwa ukośniki. Ukośnik — znak ucieczki, żeby pominąć przejście do nowej linijki w samym kodzie, podawany jest drugi (niebieski) ukośnik.

Zrobić w weekend: zapisywanie do json do kwestionariusza, czyli wczytywanie pytań i odpowiedzi z pliku do kwestionariusza na początku

Zrobić osobny kod do podawania pytań i odpowiedzi do pliku json ankietowego, żeby poszerzyć kwestionariusz