Trwałość danych w języku Python - krótki przewodnik
Przegląd języka Python - trwałość danych
W trakcie korzystania z dowolnej aplikacji użytkownik podaje dane do przetworzenia. Dane mogą być wprowadzane za pomocą standardowego urządzenia wejściowego (klawiatury) lub innych urządzeń, takich jak plik dyskowy, skaner, kamera, kabel sieciowy, połączenie WiFi itp.
Tak odebrane dane są przechowywane w pamięci głównej komputera (RAM) w postaci różnych struktur danych, takich jak zmienne i obiekty do czasu uruchomienia aplikacji. Następnie zawartość pamięci RAM jest kasowana.
Jednak najczęściej pożądane jest, aby wartości zmiennych i / lub obiektów były przechowywane w taki sposób, aby można je było odzyskać w dowolnym momencie, zamiast ponownie wprowadzać te same dane.
Słowo „trwałość” oznacza „trwanie efektu po usunięciu jego przyczyny”. Termin trwałość danych oznacza, że nadal istnieje nawet po zakończeniu działania aplikacji. W związku z tym dane przechowywane na trwałym nośniku danych, takim jak plik dyskowy, są trwałym magazynem danych.
W tym samouczku zbadamy różne wbudowane i zewnętrzne moduły Pythona do przechowywania i pobierania danych do / z różnych formatów, takich jak pliki tekstowe, pliki CSV, JSON i XML, a także relacyjne i nierelacyjne bazy danych.
Korzystając z wbudowanego obiektu File w Pythonie, możliwe jest zapisywanie danych łańcuchowych do pliku dyskowego i odczytywanie z niego. Standardowa biblioteka Pythona zapewnia moduły do przechowywania i pobierania zserializowanych danych w różnych strukturach danych, takich jak JSON i XML.
DB-API języka Python zapewnia standardowy sposób interakcji z relacyjnymi bazami danych. Inne pakiety Pythona innych firm oferują funkcjonalność interfejsów z bazami danych NOSQL, takimi jak MongoDB i Cassandra.
W tym samouczku przedstawiono również bazę danych ZODB, która jest trwałym API dla obiektów Pythona. Format Microsoft Excel to bardzo popularny format plików danych. W tym samouczku nauczymy się obsługiwać plik .xlsx za pomocą języka Python.
Python używa wbudowanego input() i print()funkcje do wykonywania standardowych operacji wejścia / wyjścia. Funkcja input () odczytuje bajty ze standardowego urządzenia wejściowego, tj. Klawiatury.
Plik print()funkcja z drugiej strony wysyła dane do standardowego urządzenia wyjściowego, czyli monitora. Program w języku Python współdziała z tymi urządzeniami we / wy za pośrednictwem standardowych obiektów strumieniowychstdin i stdout zdefiniowane w module sys.
Plik input()funkcja jest właściwie opakowaniem otaczającym metodę readline () obiektu sys.stdin. Wszystkie naciśnięcia klawiszy ze strumienia wejściowego są odbierane do naciśnięcia klawisza „Enter”.
>>> import sys
>>> x=sys.stdin.readline()
Welcome to TutorialsPoint
>>> x
'Welcome to TutorialsPoint\n'
Zauważ, że readline()funkcja pozostawia na końcu znak „\ n”. Istnieje również metoda read (), która odczytuje dane ze standardowego strumienia wejściowego do momentu zakończenia przezCtrl+D postać.
>>> x=sys.stdin.read()
Hello
Welcome to TutorialsPoint
>>> x
'Hello\nWelcome to TutorialsPoint\n'
Podobnie, print() jest wygodną funkcją emulującą metodę write () obiektu stdout.
>>> x='Welcome to TutorialsPoint\n'
>>> sys.stdout.write(x)
Welcome to TutorialsPoint
26
Podobnie jak predefiniowane obiekty strumieniowe stdin i stdout, program w języku Python może odczytywać dane zi wysyłać je do pliku dyskowego lub gniazda sieciowego. Są też strumieniami. Każdy obiekt, który posiada metodę read (), jest strumieniem wejściowym. Każdy obiekt posiadający metodę write () jest strumieniem wyjściowym. Komunikacja ze strumieniem jest nawiązana poprzez uzyskanie odniesienia do obiektu stream z wbudowaną funkcją open ().
funkcja open ()
Ta funkcja wbudowana używa następujących argumentów -
f=open(name, mode, buffering)
Parametr name to nazwa pliku dyskowego lub ciąg bajtów, tryb to opcjonalny ciąg jednoznakowy określający typ operacji do wykonania (odczyt, zapis, dołączanie itp.), A parametr buforowania wynosi 0, 1 lub -1 buforowanie jest wyłączone, włączone lub ustawienie domyślne systemu.
Tryb otwierania plików jest wyliczony zgodnie z poniższą tabelą. Tryb domyślny to „r”
Sr.No | Parametry i opis |
---|---|
1 | R Otwórz do czytania (domyślnie) |
2 | W Otwórz do zapisu, najpierw obcinając plik |
3 | X Utwórz nowy plik i otwórz go do zapisu |
4 | A Otwórz do zapisu, dołączając do końca pliku, jeśli istnieje |
5 | B Tryb binarny |
6 | T Tryb tekstowy (domyślny) |
7 | + Otwórz plik na dysku do aktualizacji (odczyt i zapis) |
Aby zapisać dane do pliku, należy go otworzyć w trybie „w”.
f=open('test.txt','w')
Ten obiekt pliku działa jako strumień wyjściowy i ma dostęp do metody write (). Metoda write () wysyła ciąg znaków do tego obiektu i jest przechowywana w pliku będącym jego podstawą.
string="Hello TutorialsPoint\n"
f.write(string)
Ważne jest, aby zamknąć strumień, aby zapewnić, że wszelkie dane pozostające w buforze zostaną do niego w całości przeniesione.
file.close()
Spróbuj otworzyć plik „test.txt” za pomocą dowolnego edytora testów (np. Notatnika), aby potwierdzić pomyślne utworzenie pliku.
Aby programowo odczytać zawartość pliku „test.txt”, należy go otworzyć w trybie „r”.
f=open('test.txt','r')
Ten obiekt zachowuje się jak strumień wejściowy. Python może pobierać dane ze strumienia przy użyciuread() metoda.
string=f.read()
print (string)
Zawartość pliku jest wyświetlana na konsoli Pythona. Obiekt File obsługuje również plikireadline() metoda, która jest w stanie odczytać łańcuch do momentu napotkania znaku EOF.
Jeśli jednak ten sam plik zostanie otwarty w trybie „w” w celu zapisania w nim dodatkowego tekstu, wcześniejsza zawartość zostanie usunięta. Za każdym razem, gdy plik jest otwierany z uprawnieniami do zapisu, jest traktowany tak, jakby był nowym plikiem. Aby dodać dane do istniejącego pliku, użyj „a” jako trybu dołączania.
f=open('test.txt','a')
f.write('Python Tutorials\n')
Plik ma teraz zarówno wcześniej, jak i nowo dodany ciąg. Obiekt pliku obsługuje również plikiwritelines() metody, aby zapisać każdy ciąg z obiektu listy do pliku.
f=open('test.txt','a')
lines=['Java Tutorials\n', 'DBMS tutorials\n', 'Mobile development tutorials\n']
f.writelines(lines)
f.close()
Przykład
Plik readlines()metoda zwraca listę ciągów znaków, z których każdy reprezentuje wiersz w pliku. Możliwe jest również czytanie pliku linia po linii, aż do osiągnięcia końca pliku.
f=open('test.txt','r')
while True:
line=f.readline()
if line=='' : break
print (line, end='')
f.close()
Wynik
Hello TutorialsPoint
Python Tutorials
Java Tutorials
DBMS tutorials
Mobile development tutorials
Tryb binarny
Domyślnie operacje odczytu / zapisu na obiekcie pliku są wykonywane na danych ciągu tekstowego. Jeśli chcemy obsługiwać pliki innych typów, takie jak media (mp3), pliki wykonywalne (exe), obrazy (jpg) itp., Musimy dodać przedrostek „b” do trybu odczytu / zapisu.
Poniższa instrukcja konwertuje ciąg na bajty i zapisuje w pliku.
f=open('test.bin', 'wb')
data=b"Hello World"
f.write(data)
f.close()
Konwersja ciągu tekstowego na bajty jest również możliwa przy użyciu funkcji encode ().
data="Hello World".encode('utf-8')
Musimy użyć ‘rb’tryb do odczytu pliku binarnego. Zwracana wartość metody read () jest najpierw dekodowana przed wydrukowaniem.
f=open('test.bin', 'rb')
data=f.read()
print (data.decode(encoding='utf-8'))
Aby zapisać dane całkowite w pliku binarnym, obiekt integer powinien zostać przekonwertowany na bajty po to_bytes() metoda.
n=25
n.to_bytes(8,'big')
f=open('test.bin', 'wb')
data=n.to_bytes(8,'big')
f.write(data)
Aby odczytać z pliku binarnego, przekonwertuj wyjście funkcji read () na liczbę całkowitą za pomocą funkcji from_bytes ().
f=open('test.bin', 'rb')
data=f.read()
n=int.from_bytes(data, 'big')
print (n)
W przypadku danych zmiennoprzecinkowych musimy użyć struct moduł ze standardowej biblioteki Pythona.
import struct
x=23.50
data=struct.pack('f',x)
f=open('test.bin', 'wb')
f.write(data)
Rozpakowanie ciągu znaków z funkcji read () w celu pobrania danych zmiennoprzecinkowych z pliku binarnego.
f=open('test.bin', 'rb')
data=f.read()
x=struct.unpack('f', data)
print (x)
Jednoczesny odczyt / zapis
Gdy plik jest otwierany do zapisu (za pomocą „w” lub „a”), nie można go odczytać i odwrotnie. Spowoduje to zgłoszenie błędu UnSupportedOperation. Musimy zamknąć plik przed wykonaniem innej operacji.
Aby wykonać obie operacje jednocześnie, musimy dodać znak „+” w parametrze mode. Stąd tryb „w +” lub „r +” umożliwia używanie metod write () oraz read () bez zamykania pliku. Obiekt File obsługuje również funkcję seek () w celu przewinięcia strumienia do dowolnej pozycji w bajcie.
f=open('test.txt','w+')
f.write('Hello world')
f.seek(0,0)
data=f.read()
print (data)
f.close()
Poniższa tabela zawiera podsumowanie wszystkich metod dostępnych dla pliku takiego jak obiekt.
Sr.No | Metoda i opis |
---|---|
1 | close() Zamyka plik. Zamkniętego pliku nie można już odczytać ani zapisać. |
2 | flush() Wyczyść bufor wewnętrzny. |
3 | fileno() Zwraca deskryptor pliku będącego liczbą całkowitą. |
4 | next() Zwraca następną linię z pliku przy każdym wywołaniu. Użyj iteratora next () w Pythonie 3. |
5 | read([size]) Odczytuje maksymalnie rozmiar bajtów z pliku (mniej, jeśli odczyt osiągnie EOF przed uzyskaniem rozmiaru bajtów). |
6 | readline([size]) Czyta całą linię z pliku. Końcowy znak nowej linii jest przechowywany w ciągu. |
7 | readlines([sizehint]) Odczytuje do EOF przy użyciu readline () i zwraca listę zawierającą wiersze. |
8 | seek(offset[, whence]) Ustawia bieżącą pozycję pliku. 0-początek 1-prąd 2-koniec. |
9 | seek(offset[, whence]) Ustawia bieżącą pozycję pliku. 0-początek 1-prąd 2-koniec. |
10 | tell() Zwraca bieżącą pozycję pliku |
11 | truncate([size]) Obcina rozmiar pliku. |
12 | write(str) Zapisuje ciąg do pliku. Nie ma wartości zwracanej. |
Oprócz obiektu File zwróconego przez open()function, operacje we / wy na plikach mogą być również wykonywane przy użyciu wbudowanej biblioteki Pythona z modułem os, który zapewnia przydatne funkcje zależne od systemu operacyjnego. Te funkcje wykonują operacje odczytu / zapisu niskiego poziomu na pliku.
Plik open()funkcja z modułu os jest podobna do wbudowanej funkcji open (). Jednak nie zwraca obiektu pliku, ale deskryptor pliku, unikalną liczbę całkowitą odpowiadającą otwartemu plikowi. Wartości deskryptorów pliku 0, 1 i 2 reprezentują strumienie stdin, stdout i stderr. Inne pliki otrzymają przyrostowy deskryptor pliku od 2 wzwyż.
Jak w przypadku open() wbudowana funkcja, os.open()funkcja musi również określić tryb dostępu do pliku. Poniższa tabela zawiera listę różnych trybów zdefiniowanych w module os.
Sr.No. | Moduł Os i opis |
---|---|
1 | os.O_RDONLY Otwarte tylko do odczytu |
2 | os.O_WRONLY Otwarte tylko do pisania |
3 | os.O_RDWR Otwarte do czytania i pisania |
4 | os.O_NONBLOCK Nie blokuj po otwarciu |
5 | os.O_APPEND Dołącz do każdego zapisu |
6 | os.O_CREAT Utwórz plik, jeśli nie istnieje |
7 | os.O_TRUNC Obetnij rozmiar do 0 |
8 | os.O_EXCL Błąd, jeśli istnieje tworzenie i plik |
Aby otworzyć nowy plik do zapisywania w nim danych, określ O_WRONLY jak również O_CREATtryby, wstawiając operator potoku (|). Funkcja os.open () zwraca deskryptor pliku.
f=os.open("test.dat", os.O_WRONLY|os.O_CREAT)
Zauważ, że dane są zapisywane do pliku dyskowego w postaci ciągu bajtów. W związku z tym normalny ciąg jest konwertowany na ciąg bajtów za pomocą funkcji encode (), jak wcześniej.
data="Hello World".encode('utf-8')
Funkcja write () w module os akceptuje ten ciąg bajtów i deskryptor pliku.
os.write(f,data)
Nie zapomnij zamknąć pliku za pomocą funkcji close ().
os.close(f)
Aby odczytać zawartość pliku za pomocą funkcji os.read (), użyj następujących instrukcji:
f=os.open("test.dat", os.O_RDONLY)
data=os.read(f,20)
print (data.decode('utf-8'))
Zauważ, że funkcja os.read () wymaga deskryptora pliku i liczby bajtów do odczytania (długość ciągu bajtów).
Jeśli chcesz otworzyć plik do jednoczesnych operacji odczytu / zapisu, użyj trybu O_RDWR. Poniższa tabela przedstawia ważne funkcje związane z operacjami na plikach w module systemu operacyjnego.
Sr.No | Funkcje i opis |
---|---|
1 | os.close(fd) Zamknij deskryptor pliku. |
2 | os.open(file, flags[, mode]) Otwórz plik i ustaw różne flagi zgodnie z flagami i prawdopodobnie jego trybem zgodnie z trybem. |
3 | os.read(fd, n) Odczytaj co najwyżej n bajtów z deskryptora pliku fd. Zwraca ciąg zawierający odczytane bajty. Jeśli osiągnięto koniec pliku, do którego odwołuje się fd, zwracany jest pusty łańcuch. |
4 | os.write(fd, str) Zapisz łańcuch str do deskryptora pliku fd. Zwraca liczbę faktycznie zapisanych bajtów. |
Wbudowany obiekt pliku Pythona zwracany przez wbudowaną funkcję open () języka Python ma jedną ważną wadę. Po otwarciu w trybie „w” metoda write () akceptuje tylko obiekt typu string.
Oznacza to, że jeśli masz dane reprezentowane w dowolnej postaci niebędącej ciągiem, obiekt albo wbudowanych klas (liczby, słownik, listy lub krotki) lub innych klas zdefiniowanych przez użytkownika, nie można ich zapisać bezpośrednio do pliku. Przed napisaniem musisz przekonwertować go na reprezentację ciągu.
numbers=[10,20,30,40]
file=open('numbers.txt','w')
file.write(str(numbers))
file.close()
W przypadku pliku binarnego argument do write()metoda musi być obiektem bajtowym. Na przykład lista liczb całkowitych jest konwertowana na bajty wedługbytearray() funkcji, a następnie zapisywane do pliku.
numbers=[10,20,30,40]
data=bytearray(numbers)
file.write(data)
file.close()
Aby odczytać dane z pliku w odpowiednim typie danych, należy wykonać odwrotną konwersję.
file=open('numbers.txt','rb')
data=file.read()
print (list(data))
Ten typ ręcznej konwersji obiektu na format ciągowy lub bajtowy (i odwrotnie) jest bardzo uciążliwy i żmudny. Możliwe jest przechowywanie stanu obiektu Pythona w postaci strumienia bajtów bezpośrednio do pliku lub strumienia pamięci i przywracanie do jego pierwotnego stanu. Ten proces nazywa się serializacją i deserializacją.
Wbudowana biblioteka Pythona zawiera różne moduły do serializacji i procesu deserializacji.
Sr.No. | Nazwa i opis |
---|---|
1 | pickle Biblioteka serializacji specyficzna dla języka Python |
2 | marshal Biblioteka używana wewnętrznie do serializacji |
3 | shelve Trwałość obiektów w Pythonie |
4 | dbm biblioteka oferująca interfejs do bazy danych Unix |
5 | csv biblioteka do przechowywania i pobierania danych Pythona do formatu CSV |
6 | json Biblioteka do serializacji do uniwersalnego formatu JSON |
Terminologia Pythona dotycząca serializacji i deserializacji to odpowiednio wytrawianie i rozpakowywanie. Moduł pickle w bibliotece Pythona używa bardzo specyficznego dla Pythona formatu danych. W związku z tym aplikacje inne niż Python mogą nie być w stanie poprawnie deserializować marynowanych danych. Zaleca się również, aby nie usuwać danych z nieuwierzytelnionego źródła.
Zserializowane (marynowane) dane mogą być przechowywane w postaci ciągu bajtów lub pliku binarnym. Ten moduł definiujedumps() i loads()funkcje do wytrawiania i rozpakowywania danych przy użyciu ciągu bajtów. W przypadku procesu opartego na plikach moduł madump() i load() funkcjonować.
Protokoły pickle w Pythonie są konwencjami używanymi przy konstruowaniu i dekonstruowaniu obiektów Pythona do / z danych binarnych. Obecnie moduł pikle definiuje 5 różnych protokołów wymienionych poniżej -
Sr.No. | Nazwy i opis |
---|---|
1 | Protocol version 0 Oryginalny „czytelny dla człowieka” protokół kompatybilny wstecz z wcześniejszymi wersjami. |
2 | Protocol version 1 Stary format binarny jest również zgodny z wcześniejszymi wersjami Pythona. |
3 | Protocol version 2 Wprowadzone w Pythonie 2.3 zapewnia wydajne wytrawianie klas w nowym stylu. |
4 | Protocol version 3 Dodano w Pythonie 3.0. zalecane, gdy wymagana jest zgodność z innymi wersjami Pythona 3. |
5 | Protocol version 4 został dodany w Pythonie 3.4. Dodaje obsługę bardzo dużych obiektów |
Przykład
Moduł pikle składa się z funkcji dumps (), która zwraca ciąg reprezentujący dane marynowane.
from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)
Wynik
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.
Przykład
Użyj funkcji load (), aby rozpakować łańcuch i uzyskać oryginalny obiekt słownika.
from pickle import load
dct=loads(dctstring)
print (dct)
Wynik
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
Marynowane obiekty mogą być również trwale przechowywane w pliku dyskowym za pomocą funkcji dump () i pobierane za pomocą funkcji load ().
import pickle
f=open("data.txt","wb")
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()
#to read
import pickle
f=open("data.txt","rb")
d=pickle.load(f)
print (d)
f.close()
Moduł pickle zapewnia również zorientowane obiektowo API dla mechanizmu serializacji w postaci Pickler i Unpickler zajęcia.
Jak wspomniano powyżej, podobnie jak obiekty wbudowane w Pythonie, obiekty klas zdefiniowanych przez użytkownika mogą być również trwale serializowane w pliku dyskowym. W poniższym programie definiujemy klasę użytkownika z nazwą i numerem telefonu jako atrybutami instancji. Oprócz konstruktora __init __ () klasa przesłania metodę __str __ (), która zwraca ciąg znaków reprezentujący swój obiekt.
class User:
def __init__(self,name, mob):
self.name=name
self.mobile=mob
def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))
Aby zalać obiekt powyższej klasy w pliku używamy klasy pickler i jej metody dump ().
from pickle import Pickler
user1=User('Rajani', '[email protected]', '1234567890')
file=open('userdata','wb')
Pickler(file).dump(user1)
Pickler(file).dump(user2)
file.close()
I odwrotnie, klasa Unpickler ma metodę load () do pobierania zserializowanego obiektu w następujący sposób -
from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)
Funkcje serializacji obiektów modułu marshal w standardowej bibliotece Pythona są podobne do modułu pikle. Jednak ten moduł nie jest używany do danych ogólnego przeznaczenia. Z drugiej strony jest używany przez sam Python do wewnętrznej serializacji obiektów Pythona do obsługi operacji odczytu / zapisu na skompilowanych wersjach modułów Pythona (pliki .pyc).
Format danych używany przez moduł Marshal nie jest zgodny z wersjami języka Python. Dlatego skompilowany skrypt Pythona (plik .pyc) jednej wersji najprawdopodobniej nie zostanie wykonany na innej.
Podobnie jak moduł pickle, moduł marshal zdefiniował również funkcje load () i dump () do odczytu i zapisu uporządkowanych obiektów z / do pliku.
wysypisko()
Ta funkcja zapisuje do pliku reprezentację bajtów obsługiwanego obiektu Pythona. Plik sam w sobie jest plikiem binarnym z uprawnieniami do zapisu
Załaduj()
Ta funkcja odczytuje dane bajtowe z pliku binarnego i konwertuje je na obiekt Pythona.
Poniższy przykład demonstruje użycie funkcji dump () i load () do obsługi obiektów kodu Pythona, które są używane do przechowywania wstępnie skompilowanych modułów Pythona.
Kod korzysta z wbudowanego compile() funkcja, aby zbudować obiekt kodu z ciągu źródłowego, który osadza instrukcje Pythona.
compile(source, file, mode)
Parametr pliku powinien być plikiem, z którego został odczytany kod. Jeśli nie został odczytany z pliku, należy przekazać dowolny ciąg.
Parametr trybu to „exec”, jeśli źródło zawiera sekwencję instrukcji, „eval”, jeśli istnieje pojedyncze wyrażenie, lub „single”, jeśli zawiera pojedynczą instrukcję interaktywną.
Obiekt kodu kompilacji jest następnie przechowywany w pliku .pyc przy użyciu funkcji dump ().
import marshal
script = """
a=10
b=20
print ('addition=',a+b)
"""
code = compile(script, "script", "exec")
f=open("a.pyc","wb")
marshal.dump(code, f)
f.close()
Do deserializacji obiekt z pliku .pyc używa funkcji load (). Ponieważ zwraca obiekt kodu, można go uruchomić za pomocą exec (), innej funkcji wbudowanej.
import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)
Moduł shelve w standardowej bibliotece Pythona zapewnia prosty, ale skuteczny mechanizm trwałości obiektów. Obiekt półki zdefiniowany w tym module jest obiektem podobnym do słownika, który jest trwale przechowywany w pliku dyskowym. Tworzy to plik podobny do bazy danych dbm w systemach typu UNIX.
Słownik półkowy ma pewne ograniczenia. W tym specjalnym obiekcie słownika jako klucz może być używany tylko typ danych typu string, natomiast jako wartość można użyć dowolnego obiektu Pythona, który można pobrać.
Moduł półki definiuje trzy klasy w następujący sposób -
Sr.No | Moduł półki i opis |
---|---|
1 | Shelf To jest klasa bazowa dla implementacji półek. Jest inicjalizowany za pomocą obiektu podobnego do dyktowania. |
2 | BsdDbShelf To jest podklasa klasy Shelf. Obiekt dict przekazany do jego konstruktora musi obsługiwać metody first (), next (), previous (), last () i set_location (). |
3 | DbfilenameShelf Jest to również podklasa Shelf, ale akceptuje nazwę pliku jako parametr swojego konstruktora, a nie obiekt dict. |
Funkcja open () zdefiniowana w module shelve, która zwraca plik DbfilenameShelf obiekt.
open(filename, flag='c', protocol=None, writeback=False)
Do utworzonej bazy danych przypisywany jest parametr nazwa_pliku. Domyślną wartością parametru flagi jest „c” dla dostępu do odczytu / zapisu. Inne flagi to „w” (tylko do zapisu) „r” (tylko do odczytu) i „n” (nowe z możliwością odczytu / zapisu).
Sama serializacja jest zarządzana przez protokół pickle, domyślnie brak. Domyślnym parametrem zapisywania zwrotnego ostatniego parametru jest false. Jeśli ma wartość true, pozycje, do których uzyskano dostęp, są buforowane. Każdy dostęp wywołuje operacje sync () i close (), stąd proces może być powolny.
Poniższy kod tworzy bazę danych i przechowuje w niej wpisy słownika.
import shelve
s=shelve.open("test")
s['name']="Ajay"
s['age']=23
s['marks']=75
s.close()
Spowoduje to utworzenie pliku test.dir w bieżącym katalogu i przechowywanie danych klucz-wartość w postaci zaszyfrowanej. Obiekt Shelf ma dostępne następujące metody -
Sr.No. | Metody i opis |
---|---|
1 | close() zsynchronizuj i zamknij trwały obiekt dict. |
2 | sync() Zapisz wszystkie wpisy w pamięci podręcznej, jeśli półka została otwarta z zapisem zwrotnym ustawionym na True. |
3 | get() zwraca wartość skojarzoną z kluczem |
4 | items() lista krotek - każda krotka to para klucz-wartość |
5 | keys() lista kluczy półek |
6 | pop() usuń określony klucz i zwróć odpowiednią wartość. |
7 | update() Zaktualizuj półkę z innego dyktu / iterowalnego |
8 | values() lista wartości półkowych |
Aby uzyskać dostęp do wartości określonego klucza na półce -
s=shelve.open('test')
print (s['age']) #this will print 23
s['age']=25
print (s.get('age')) #this will print 25
s.pop('marks') #this will remove corresponding k-v pair
Podobnie jak w przypadku wbudowanego obiektu słownika, metody items (), keys () i values () zwracają obiekty widoku.
print (list(s.items()))
[('name', 'Ajay'), ('age', 25), ('marks', 75)]
print (list(s.keys()))
['name', 'age', 'marks']
print (list(s.values()))
['Ajay', 25, 75]
Aby połączyć pozycje z innego słownika z półką, użyj metody update ().
d={'salary':10000, 'designation':'manager'}
s.update(d)
print (list(s.items()))
[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]
Pakiet dbm zawiera słownik podobny do interfejsu baz danych w stylu DBM. DBM stands for DataBase Manager. Jest używany przez system operacyjny UNIX (i podobny do UNIX). Biblioteka dbbm to prosty silnik bazy danych napisany przez Kena Thompsona. Te bazy danych używają zakodowanych binarnie obiektów łańcuchowych jako klucza, a także wartości.
Baza danych przechowuje dane przy użyciu pojedynczego klucza (klucza podstawowego) w zasobnikach o stałym rozmiarze i wykorzystuje techniki mieszania, aby umożliwić szybkie pobieranie danych według klucza.
Pakiet dbm zawiera następujące moduły -
dbm.gnu module jest interfejsem do wersji biblioteki DBM zaimplementowanej w projekcie GNU.
dbm.ndbm Moduł zapewnia interfejs do implementacji UNIX nbdm.
dbm.dumbjest używana jako opcja rezerwowa w przypadku, gdy inne implementacje dbm nie zostaną znalezione. Nie wymaga to żadnych zewnętrznych zależności, ale jest wolniejsze niż inne.
>>> dbm.whichdb('mydbm.db')
'dbm.dumb'
>>> import dbm
>>> db=dbm.open('mydbm.db','n')
>>> db['name']=Raj Deshmane'
>>> db['address']='Kirtinagar Pune'
>>> db['PIN']='431101'
>>> db.close()
Funkcja open () umożliwia tryb tych flag -
Sr.No. | Wartość i znaczenie |
---|---|
1 | 'r' Otwórz istniejącą bazę danych tylko do odczytu (domyślnie) |
2 | 'w' Otwórz istniejącą bazę danych do czytania i pisania |
3 | 'c' Otwórz bazę danych do czytania i pisania, tworząc ją, jeśli nie istnieje |
4 | 'n' Zawsze twórz nową, pustą bazę danych, otwartą do czytania i pisania |
Obiekt dbm jest obiektem słownikowym, podobnie jak obiekt półki. W związku z tym można wykonywać wszystkie operacje słownikowe. Obiekt dbm może wywoływać metody get (), pop (), append () i update (). Poniższy kod otwiera „mydbm.db” z flagą „r” i wykonuje iterację nad kolekcją par klucz-wartość.
>>> db=dbm.open('mydbm.db','r')
>>> for k,v in db.items():
print (k,v)
b'name' : b'Raj Deshmane'
b'address' : b'Kirtinagar Pune'
b'PIN' : b'431101'
CSV stands for comma separated values. Ten format pliku jest powszechnie używanym formatem danych podczas eksportowania / importowania danych do / z arkuszy kalkulacyjnych i tabel danych w bazach danych. Moduł csv został włączony do standardowej biblioteki Pythona w wyniku PEP 305. Przedstawia klasy i metody wykonywania operacji odczytu / zapisu na pliku CSV zgodnie z zaleceniami PEP 305.
CSV jest preferowanym formatem eksportu danych przez oprogramowanie arkusza kalkulacyjnego Microsoft Excel. Jednak moduł csv może również obsługiwać dane reprezentowane przez inne dialekty.
Interfejs API CSV składa się z następujących klas pisarzy i czytelników -
pisarz()
Ta funkcja w module csv zwraca obiekt zapisujący, który konwertuje dane na rozdzielany ciąg i przechowuje w obiekcie pliku. Funkcja wymaga obiektu pliku z uprawnieniem do zapisu jako parametru. Każdy wiersz zapisany w pliku generuje znak nowej linii. Aby uniknąć dodatkowego odstępu między wierszami, parametr nowej linii jest ustawiony na „”.
Klasa pisarza ma następujące metody -
writerow ()
Ta metoda zapisuje elementy w postaci iterowalnej (lista, krotka lub ciąg), oddzielając je przecinkiem.
pisarze ()
Ta metoda przyjmuje listę elementów iterowalnych jako parametr i zapisuje każdy element jako oddzieloną przecinkami linię elementów w pliku.
Example
Poniższy przykład pokazuje użycie funkcji writer (). Najpierw plik jest otwierany w trybie „w”. Ten plik jest używany do uzyskiwania obiektu zapisującego. Każda krotka na liście krotek jest następnie zapisywana do pliku przy użyciu metody writerow ().
import csv
persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
csvfile=open('persons.csv','w', newline='')
obj=csv.writer(csvfile)
for person in persons:
obj.writerow(person)
csvfile.close()
Output
Spowoduje to utworzenie pliku „people.csv” w bieżącym katalogu. Pokaże następujące dane.
Lata,22,45
Anil,21,56
John,20,60
Zamiast iteracji po liście, aby zapisać każdy wiersz z osobna, możemy użyć metody writerows ().
csvfile=open('persons.csv','w', newline='')
persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
obj=csv.writer(csvfile)
obj.writerows(persons)
obj.close()
czytelnik()
Ta funkcja zwraca obiekt czytnika, który zwraca iterator wierszy w csv file. Używając zwykłej pętli for, wszystkie wiersze w pliku są wyświetlane w następującym przykładzie -
Przykład
csvfile=open('persons.csv','r', newline='')
obj=csv.reader(csvfile)
for row in obj:
print (row)
Wynik
['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']
Obiekt czytnika jest iteratorem. W związku z tym obsługuje funkcję next (), której można również użyć do wyświetlenia wszystkich wierszy w pliku csv zamiast plikufor loop.
csvfile=open('persons.csv','r', newline='')
obj=csv.reader(csvfile)
while True:
try:
row=next(obj)
print (row)
except StopIteration:
break
Jak wspomniano wcześniej, moduł csv używa Excela jako domyślnego dialektu. Moduł csv definiuje również klasę dialektu. Dialect to zestaw standardów używanych do implementacji protokołu CSV. Listę dostępnych dialektów można uzyskać za pomocą funkcji list_dialects ().
>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']
Oprócz elementów iteracyjnych, moduł csv może eksportować obiekt słownika do pliku CSV i czytać go w celu wypełnienia obiektu słownika Pythona. W tym celu moduł ten definiuje następujące klasy -
DictWriter ()
Ta funkcja zwraca obiekt DictWriter. Jest podobny do obiektu pisarza, ale wiersze są mapowane na obiekt słownika. Funkcja wymaga obiektu pliku z uprawnieniami do zapisu i listy kluczy używanych w słowniku jako parametr nazw pól. Służy do zapisania pierwszej linii w pliku jako nagłówka.
writeheader ()
Ta metoda zapisuje listę kluczy w słowniku jako linię oddzieloną przecinkami jako pierwszą linię w pliku.
W poniższym przykładzie zdefiniowano listę elementów słownika. Każda pozycja na liście to słownik. Używając metody writrows (), są one zapisywane do pliku w sposób oddzielony przecinkami.
persons=[
{'name':'Lata', 'age':22, 'marks':45},
{'name':'Anil', 'age':21, 'marks':56},
{'name':'John', 'age':20, 'marks':60}
]
csvfile=open('persons.csv','w', newline='')
fields=list(persons[0].keys())
obj=csv.DictWriter(csvfile, fieldnames=fields)
obj.writeheader()
obj.writerows(persons)
csvfile.close()
Plik people.csv zawiera następującą zawartość -
name,age,marks
Lata,22,45
Anil,21,56
John,20,60
DictReader ()
Ta funkcja zwraca obiekt DictReader z bazowego pliku CSV. Podobnie jak w przypadku obiektu reader, ten jest również iteratorem, za pomocą którego pobierana jest zawartość pliku.
csvfile=open('persons.csv','r', newline='')
obj=csv.DictReader(csvfile)
Klasa udostępnia atrybut fieldnames, zwracający klucze słownika używane jako nagłówek pliku.
print (obj.fieldnames)
['name', 'age', 'marks']
Użyj pętli nad obiektem DictReader, aby pobrać poszczególne obiekty słownika.
for row in obj:
print (row)
Powoduje to następujący wynik -
OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])
Aby przekonwertować obiekt OrderedDict do zwykłego słownika, musimy najpierw zaimportować OrderedDict z modułu collections.
from collections import OrderedDict
r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}
JSON oznacza JavaScript Object Notation. Jest to lekki format wymiany danych. Jest to niezależny od języka i wieloplatformowy format tekstowy, obsługiwany przez wiele języków programowania. Ten format jest używany do wymiany danych między serwerem WWW a klientami.
Format JSON jest podobny do marynowania. Jednak serializacja pikle jest specyficzna dla Pythona, podczas gdy format JSON jest implementowany w wielu językach, dlatego stał się uniwersalnym standardem. Funkcjonalność i interfejs modułu json w standardowej bibliotece Pythona jest podobny do modułów pickle i marshal.
Podobnie jak w module pickle, moduł json zapewnia również dumps() i loads() funkcja do serializacji obiektu Python do łańcucha zakodowanego w formacie JSON oraz dump() i load() funkcje zapisują i odczytują zserializowane obiekty Pythona do / z pliku.
dumps() - Ta funkcja konwertuje obiekt do formatu JSON.
loads() - Ta funkcja konwertuje ciąg JSON z powrotem na obiekt Pythona.
Poniższy przykład przedstawia podstawowe użycie tych funkcji -
import json
data=['Rakesh',{'marks':(50,60,70)}]
s=json.dumps(data)
json.loads(s)
Funkcja dumps () może przyjmować opcjonalny argument sort_keys. Domyślnie jest to Fałsz. Jeśli jest ustawiona na True, klucze słownika są wyświetlane w kolejności posortowanej w ciągu JSON.
Funkcja dumps () ma inny opcjonalny parametr o nazwie indent, który przyjmuje liczbę jako wartość. Decyduje o długości każdego segmentu sformatowanej reprezentacji łańcucha json, podobnie jak na wydruku wyjściowym.
Moduł json posiada również obiektowe API odpowiadające powyższym funkcjom. W module zdefiniowane są dwie klasy - JSONEncoder i JSONDecoder.
JSONEncoder
Obiektem tej klasy jest koder struktur danych Pythona. Każdy typ danych Python jest konwertowany na odpowiedni typ JSON, jak pokazano w poniższej tabeli -
Pyton | JSON |
---|---|
Dict | obiekt |
lista, krotka | szyk |
Str | strunowy |
Wyliczenia typu int, float, int- i float-pochodne | numer |
Prawdziwe | prawdziwe |
Fałszywy | fałszywy |
Żaden | zero |
Instancja klasy JSONEncoder jest tworzona przez konstruktora JSONEncoder (). Następujące ważne metody są zdefiniowane w klasie enkodera -
Sr.No. | Metody i opis |
---|---|
1 | encode() serializuje obiekt Pythona do formatu JSON |
2 | iterencode() Koduje obiekt i zwraca iterator, który daje zakodowaną postać każdego elementu w obiekcie. |
3 | indent Określa poziom wcięcia zakodowanego ciągu |
4 | sort_keys ma wartość true lub false, aby klucze były wyświetlane w kolejności posortowanej lub nie. |
5 | Check_circular jeśli prawda, sprawdź odwołanie cykliczne w obiekcie typu kontenera |
Poniższy przykład koduje obiekt listy Pythona.
e=json.JSONEncoder()
e.encode(data)
Klasa JSONDecoder
Obiekt tej klasy pomaga w dekodowaniu w łańcuchu json z powrotem do struktury danych Pythona. Główną metodą w tej klasie jest decode (). Poniższy przykładowy kod pobiera obiekt listy języka Python z zakodowanego ciągu we wcześniejszym kroku.
d=json.JSONDecoder()
d.decode(s)
Moduł json definiuje load() i dump() funkcje do zapisywania danych JSON w pliku takim jak obiekt - który może być plikiem dyskowym lub strumieniem bajtów i odczytywaniem z nich danych.
wysypisko()
Ta funkcja zapisuje dane obiektu języka Python w formacie JSON do pliku. Plik należy otworzyć w trybie „w”.
import json
data=['Rakesh', {'marks': (50, 60, 70)}]
fp=open('json.txt','w')
json.dump(data,fp)
fp.close()
Ten kod utworzy „json.txt” w bieżącym katalogu. Przedstawia zawartość w następujący sposób -
["Rakesh", {"marks": [50, 60, 70]}]
Załaduj()
Ta funkcja ładuje dane JSON z pliku i zwraca z niego obiekt Pythona. Plik musi być otwarty z uprawnieniami do odczytu (powinien mieć tryb „r”).
Example
fp=open('json.txt','r')
ret=json.load(fp)
print (ret)
fp.close()
Output
['Rakesh', {'marks': [50, 60, 70]}]
Plik json.tool moduł posiada również interfejs wiersza poleceń, który sprawdza poprawność danych w pliku i drukuje obiekt JSON w całkiem sformatowany sposób.
C:\python37>python -m json.tool json.txt
[
"Rakesh",
{
"marks": [
50,
60,
70
]
}
]
XML to akronim od eXtensible Markup Language. Jest to przenośny, otwarty i wieloplatformowy język, bardzo podobny do HTML lub SGML i zalecany przez Konsorcjum World Wide Web.
Jest to dobrze znany format wymiany danych, używany przez wiele aplikacji, takich jak usługi internetowe, narzędzia biurowe i Service Oriented Architectures(SOA). Format XML jest czytelny zarówno dla komputera, jak i dla człowieka.
Pakiet xml standardowej biblioteki Pythona składa się z następujących modułów do przetwarzania XML -
Sr.No. | Moduły i opis |
---|---|
1 | xml.etree.ElementTree API ElementTree, prosty i lekki procesor XML |
2 | xml.dom definicja DOM API |
3 | xml.dom.minidom minimalna implementacja DOM |
4 | xml.sax Implementacja interfejsu SAX2 |
5 | xml.parsers.expat powiązanie parsera Expat |
Dane w dokumencie XML są ułożone w hierarchicznym formacie przypominającym drzewo, zaczynając od katalogu głównego i elementów. Każdy element jest pojedynczym węzłem w drzewie i ma atrybut ujęty w znaczniki <> i </>. Do każdego elementu można przypisać jeden lub więcej elementów podrzędnych.
Poniżej znajduje się typowy przykład dokumentu XML -
<?xml version = "1.0" encoding = "iso-8859-1"?>
<studentlist>
<student>
<name>Ratna</name>
<subject>Physics</subject>
<marks>85</marks>
</student>
<student>
<name>Kiran</name>
<subject>Maths</subject>
<marks>100</marks>
</student>
<student>
<name>Mohit</name>
<subject>Biology</subject>
<marks>92</marks>
</student>
</studentlist>
Podczas używania ElementTreemoduł, pierwszym krokiem jest skonfigurowanie głównego elementu drzewa. Każdy element ma tag i atrybut, który jest obiektem dyktowania. W przypadku elementu głównego atrybut jest pustym słownikiem.
import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')
Teraz możemy dodać jeden lub więcej elementów pod elementem głównym. Każdy obiekt elementu może miećSubElements. Każdy element podrzędny ma atrybut i właściwość tekstową.
student=xmlobj.Element('student')
nm=xmlobj.SubElement(student, 'name')
nm.text='name'
subject=xmlobj.SubElement(student, 'subject')
nm.text='Ratna'
subject.text='Physics'
marks=xmlobj.SubElement(student, 'marks')
marks.text='85'
Ten nowy element jest dołączany do katalogu głównego za pomocą metody append ().
root.append(student)
Dołącz dowolną liczbę elementów, korzystając z powyższej metody. Na koniec obiekt elementu głównego jest zapisywany do pliku.
tree = xmlobj.ElementTree(root)
file = open('studentlist.xml','wb')
tree.write(file)
file.close()
Teraz widzimy, jak przeanalizować plik XML. W tym celu utwórz drzewo dokumentu, podając jego nazwę jako parametr pliku w konstruktorze ElementTree.
tree = xmlobj.ElementTree(file='studentlist.xml')
Obiekt drzewa ma getroot() do uzyskania elementu głównego, a getchildren () zwraca listę elementów znajdujących się poniżej.
root = tree.getroot()
children = root.getchildren()
Obiekt słownika odpowiadający każdemu elementowi podrzędnemu jest konstruowany przez iterację po kolekcji elementów podrzędnych każdego węzła podrzędnego.
for child in children:
student={}
pairs = child.getchildren()
for pair in pairs:
product[pair.tag]=pair.text
Każdy słownik jest następnie dołączany do listy zwracającej oryginalną listę obiektów słownika.
SAXjest standardowym interfejsem do analizowania XML sterowanego zdarzeniami. Parsowanie XML za pomocą SAX wymaga ContentHandler przez podklasę xml.sax.ContentHandler. Rejestrujesz wywołania zwrotne dla interesujących Cię zdarzeń, a następnie pozwalasz parserowi przejść przez dokument.
SAX jest przydatny, gdy twoje dokumenty są duże lub masz ograniczenia pamięci, ponieważ analizuje plik podczas odczytywania go z dysku, w wyniku czego cały plik nigdy nie jest przechowywany w pamięci.
Model obiektu dokumentu
(DOM) API to rekomendacja konsorcjum World Wide Web. W tym przypadku cały plik jest wczytywany do pamięci i zapisywany w formie hierarchicznej (opartej na drzewie), aby przedstawić wszystkie cechy dokumentu XML.
SAX, nie tak szybki jak DOM, z dużymi plikami. Z drugiej strony DOM może zabijać zasoby, jeśli jest używany w wielu małych plikach. SAX jest tylko do odczytu, podczas gdy DOM umożliwia zmiany w pliku XML.
Format plist jest używany głównie w systemie MAC OS X. Pliki te są zasadniczo dokumentami XML. Przechowują i pobierają właściwości obiektu. Biblioteka Pythona zawiera moduł plist, który służy do odczytu i zapisu plików „lista właściwości” (zwykle mają one rozszerzenie .plist).
Plik plistlib module jest mniej więcej podobny do innych bibliotek serializacji w tym sensie, że zapewnia również funkcje dumps () i load () do reprezentacji ciągów obiektów Pythona oraz funkcje load () i dump () do operacji na dysku.
Poniższy obiekt słownika zachowuje właściwość (klucz) i odpowiadającą jej wartość -
proplist = {
"name" : "Ganesh",
"designation":"manager",
"dept":"accts",
"salary" : {"basic":12000, "da":4000, "hra":800}
}
Aby zapisać te właściwości w pliku dyskowym, wywołujemy funkcję dump () w module plist.
import plistlib
fileName=open('salary.plist','wb')
plistlib.dump(proplist, fileName)
fileName.close()
I odwrotnie, aby odczytać wartości właściwości, użyj funkcji load () w następujący sposób -
fp= open('salary.plist', 'rb')
pl = plistlib.load(fp)
print(pl)
Jedną z głównych wad plików CSV, JSON, XML itp. Jest to, że nie są one zbyt przydatne w przypadku dostępu swobodnego i przetwarzania transakcji, ponieważ mają w dużej mierze charakter nieustrukturyzowany. W związku z tym bardzo trudno jest modyfikować zawartość.
Te pliki płaskie nie są odpowiednie dla środowiska klient-serwer, ponieważ nie mają możliwości przetwarzania asynchronicznego. Korzystanie z nieustrukturyzowanych plików danych prowadzi do nadmiarowości i niespójności danych.
Te problemy można rozwiązać za pomocą relacyjnej bazy danych. Baza danych to zorganizowany zbiór danych służący do usuwania nadmiarowości i niespójności oraz utrzymywania integralności danych. Model relacyjnej bazy danych jest bardzo popularny.
Jego podstawową koncepcją jest uporządkowanie danych w tabeli encji (zwanej relacją). Struktura tabeli encji zawiera jeden atrybut, którego wartość jest unikalna dla każdego wiersza. Taki atrybut nazywa się'primary key'.
Gdy klucz podstawowy jednej tabeli pojawia się w strukturze innych tabel, jest wywoływany 'Foreign key'a to stanowi podstawę relacji między nimi. W oparciu o ten model obecnie dostępnych jest wiele popularnych produktów RDBMS -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
SQLite to lekka relacyjna baza danych używana w wielu różnych zastosowaniach. Jest to samodzielny, bezserwerowy silnik transakcyjnej bazy danych SQL o zerowej konfiguracji. Cała baza danych to pojedynczy plik, który można umieścić w dowolnym miejscu w systemie plików. Jest to oprogramowanie typu open source, o bardzo małej powierzchni i zerowej konfiguracji. Jest powszechnie używany w urządzeniach wbudowanych, IOT i aplikacjach mobilnych.
Wszystkie relacyjne bazy danych używają języka SQL do obsługi danych w tabelach. Jednak wcześniej każda z tych baz danych była połączona z aplikacją w języku Python za pomocą modułu Pythona specyficznego dla typu bazy danych.
Stąd brakowało między nimi kompatybilności. Gdyby użytkownik chciał przejść na inny produkt bazodanowy, byłoby to trudne. Ten problem niekompatybilności został rozwiązany przez podniesienie „Propozycji ulepszeń języka Python (PEP 248)” w celu zalecenia spójnego interfejsu dla relacyjnych baz danych znanych jako DB-API. Najnowsze rekomendacje są nazywaneDB-APIWersja 2.0.0 (PEP 249)
Standardowa biblioteka Pythona składa się z modułu sqlite3, który jest modułem zgodnym z DB-API do obsługi bazy danych SQLite za pośrednictwem programu w języku Python. W tym rozdziale wyjaśniono łączność Pythona z bazą danych SQLite.
Jak wspomniano wcześniej, Python ma wbudowaną obsługę bazy danych SQLite w postaci modułu sqlite3. W przypadku innych baz danych odpowiedni moduł Pythona zgodny z DB-API będzie musiał zostać zainstalowany za pomocą narzędzia pip. Na przykład, aby skorzystać z bazy danych MySQL, musimy zainstalować moduł PyMySQL.
pip install pymysql
Poniższe kroki są zalecane w DB-API -
Nawiąż połączenie z bazą danych za pomocą connect() funkcji i uzyskać obiekt połączenia.
Połączenie cursor() metoda połączenia obiektu, aby uzyskać obiekt kursora.
Utwórz ciąg zapytania składający się z instrukcji SQL do wykonania.
Wykonaj żądane zapytanie, wywołując execute() metoda.
Zamknij połączenie.
import sqlite3
db=sqlite3.connect('test.db')
Tutaj db jest obiektem połączenia reprezentującym test.db. Zauważ, że ta baza danych zostanie utworzona, jeśli jeszcze nie istnieje. Baza danych obiektu połączenia ma następujące metody -
Sr.No. | Metody i opis |
---|---|
1 | cursor(): Zwraca obiekt Cursor, który używa tego połączenia. |
2 | commit(): Jawnie zatwierdza wszystkie oczekujące transakcje do bazy danych. |
3 | rollback(): Ta opcjonalna metoda powoduje wycofanie transakcji do punktu początkowego. |
4 | close(): Trwale zamyka połączenie z bazą danych. |
Kursor działa jako uchwyt dla danego zapytania SQL, umożliwiając pobranie jednego lub więcej wierszy wyniku. Obiekt Cursor jest uzyskiwany z połączenia w celu wykonywania zapytań SQL za pomocą następującej instrukcji -
cur=db.cursor()
Obiekt kursora ma zdefiniowane następujące metody -
Sr.No | Metody i opis |
---|---|
1 | execute() Wykonuje zapytanie SQL w parametrze ciągu. |
2 | executemany() Wykonuje zapytanie SQL przy użyciu zestawu parametrów z listy krotek. |
3 | fetchone() Pobiera następny wiersz z zestawu wyników zapytania. |
4 | fetchall() Pobiera wszystkie pozostałe wiersze z zestawu wyników zapytania. |
5 | callproc() Wywołuje procedurę składowaną. |
6 | close() Zamyka obiekt kursora. |
Poniższy kod tworzy tabelę w test.db: -
import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()
Pożądaną integralność danych w bazie danych zapewnia commit() i rollback()metody obiektu połączenia. Ciąg zapytania SQL może zawierać niepoprawne zapytanie SQL, które może zgłosić wyjątek, który powinien zostać poprawnie obsłużony. W tym celu instrukcja execute () jest umieszczana w bloku try. Jeśli się powiedzie, wynik jest trwale zapisywany przy użyciu metody commit (). Jeśli zapytanie nie powiedzie się, transakcja jest cofana przy użyciu metody rollback ().
Poniższy kod wykonuje zapytanie INSERT w tabeli uczniów w test.db.
import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
cur=db.cursor()
cur.execute(qry)
db.commit()
print ("record added successfully")
except:
print ("error in query")
db.rollback()
db.close()
Jeśli chcesz, aby dane w klauzuli wartości zapytania INSERT były dynamicznie dostarczane przez dane wejściowe użytkownika, użyj podstawiania parametrów zgodnie z zaleceniami w Python DB-API. The? Znak jest używany jako symbol zastępczy w ciągu zapytania i dostarcza wartości w postaci krotki w metodzie execute (). Poniższy przykład wstawia rekord przy użyciu metody podstawiania parametrów. Imię, wiek i stopnie są traktowane jako dane wejściowe.
import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
cur=db.cursor()
cur.execute(qry, (nm,a,m))
db.commit()
print ("one record added successfully")
except:
print("error in operation")
db.rollback()
db.close()
Moduł sqlite3 definiuje plik executemany()metoda, która jest w stanie dodać wiele rekordów jednocześnie. Dane do dodania należy podać w postaci listy krotek, przy czym każda krotka zawiera jeden rekord. Obiekt listy jest parametrem metody executemany () wraz z ciągiem zapytania. Jednak metoda executemany () nie jest obsługiwana przez niektóre inne moduły.
Plik UPDATEzapytanie zwykle zawiera wyrażenie logiczne określone klauzulą WHERE Łańcuch zapytania w metodzie execute () powinien zawierać składnię zapytania UPDATE. Aby zaktualizować wartość „age” do 23 dla name = „Anil”, zdefiniuj ciąg jak poniżej:
qry="update student set age=23 where name='Anil';"
Aby proces aktualizacji był bardziej dynamiczny, używamy metody zastępowania parametrów opisanej powyżej.
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (a, nm))
db.commit()
print("record updated successfully")
except:
print("error in query")
db.rollback()
db.close()
Podobnie operacja DELETE jest wykonywana poprzez wywołanie metody execute () z łańcuchem znaków o składni zapytania SQL DELETE. Nawiasem mówiąc,DELETE zapytanie zwykle zawiera również plik WHERE klauzula.
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (nm,))
db.commit()
print("record deleted successfully")
except:
print("error in operation")
db.rollback()
db.close()
Jedną z ważnych operacji na tabeli bazy danych jest pobieranie z niej rekordów. SQL zapewniaSELECTzapytanie o cel. Gdy do metody execute () podany jest łańcuch zawierający składnię zapytania SELECT, zwracany jest obiekt tabeli wyników. Istnieją dwie ważne metody z obiektem kursora, za pomocą których można pobrać jeden lub wiele rekordów z zestawu wyników.
fetchone ()
Pobiera następny dostępny rekord z zestawu wyników. Jest to krotka składająca się z wartości każdej kolumny pobranego rekordu.
fetchall ()
Pobiera wszystkie pozostałe rekordy w postaci listy krotek. Każda krotka odpowiada jednemu rekordowi i zawiera wartości każdej kolumny w tabeli.
Poniższy przykład zawiera listę wszystkich rekordów w tabeli uczniów
import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
record=cur.fetchone()
if record==None:
break
print (record)
db.close()
Jeśli planujesz używać bazy danych MySQL zamiast bazy danych SQLite, musisz zainstalować PyMySQLmoduł, jak opisano powyżej. Wszystkie kroki w procesie łączenia się z bazą danych są takie same, ponieważ baza danych MySQL jest zainstalowana na serwerze, funkcja connect () wymaga adresu URL i danych logowania.
import pymysql
con=pymysql.connect('localhost', 'root', '***')
Jedyną rzeczą, która może różnić się od SQLite, są typy danych specyficzne dla MySQL. Podobnie, każda baza danych zgodna z ODBC może być używana z Pythonem po zainstalowaniu modułu pyodbc.
Każda relacyjna baza danych przechowuje dane w tabelach. Struktura tabeli definiuje typ danych atrybutów, które są w zasadzie tylko głównymi typami danych, które są mapowane na odpowiednie wbudowane typy danych Pythona. Jednak obiekty zdefiniowane przez użytkownika w Pythonie nie mogą być trwale przechowywane i pobierane do / z tabel SQL.
Jest to rozbieżność między typami SQL a językami programowania zorientowanymi obiektowo, takimi jak Python. SQL nie ma równoważnego typu danych dla innych, takich jak dict, tuple, list lub inna klasa zdefiniowana przez użytkownika.
Jeśli musisz przechowywać obiekt w relacyjnej bazie danych, przed wykonaniem zapytania INSERT należy najpierw zdekonstruować jego atrybuty instancji na typy danych SQL. Z drugiej strony dane pobrane z tabeli SQL są w typach podstawowych. Obiekt Pythona żądanego typu będzie musiał zostać skonstruowany przy użyciu do użycia w skrypcie Python. W tym miejscu przydatne są mapery relacyjne obiektów.
Mapowanie relacji obiektów (ORM)
Na Object Relation Mapper(ORM) to interfejs między klasą a tabelą SQL. Klasa Pythona jest mapowana na określoną tabelę w bazie danych, dzięki czemu konwersja między typami obiektowymi i SQL jest wykonywana automatycznie.
Klasa Students napisana w kodzie Pythona jest odwzorowywana na tabelę Students w bazie danych. W rezultacie wszystkie operacje CRUD są wykonywane przez wywołanie odpowiednich metod klasy. Eliminuje to konieczność wykonywania zakodowanych na stałe zapytań SQL w skrypcie Python.
Biblioteka ORM działa zatem jako warstwa abstrakcji nad surowymi zapytaniami SQL i może być pomocna w szybkim tworzeniu aplikacji. SQLAlchemyjest popularnym mapowaniem relacyjnym obiektu dla Pythona. Wszelkie manipulacje stanem obiektu modelu są synchronizowane z odpowiednim wierszem w tabeli bazy danych.
Biblioteka SQLALchemy zawiera ORM API i język wyrażeń SQL (SQLAlchemy Core). Język wyrażeń bezpośrednio wykonuje prymitywne konstrukcje relacyjnej bazy danych.
ORM to abstrakcyjny wzorzec użycia wysokiego poziomu, zbudowany na podstawie języka wyrażeń SQL. Można powiedzieć, że ORM jest stosowanym zastosowaniem języka wyrażeń. W tym temacie omówimy API SQLAlchemy ORM i wykorzystamy bazę danych SQLite.
SQLAlchemy komunikuje się z różnymi typami baz danych poprzez ich implementacje DBAPI przy użyciu systemu dialektów. Wszystkie dialekty wymagają zainstalowania odpowiedniego sterownika DBAPI. Uwzględniono dialekty dla następujących typów baz danych -
- Firebird
- Microsoft SQL Server
- MySQL
- Oracle
- PostgreSQL
- SQLite
- Sybase
Instalacja SQLAlchemy jest łatwa i prosta przy użyciu narzędzia pip.
pip install sqlalchemy
Aby sprawdzić, czy SQLalchemy jest poprawnie zainstalowany i jego wersję, wprowadź następujące polecenie w zachęcie Pythona -
>>> import sqlalchemy
>>>sqlalchemy.__version__
'1.3.11'
Interakcje z bazą danych odbywają się za pośrednictwem obiektu Engine otrzymanego jako wartość zwracana create_engine() funkcjonować.
engine =create_engine('sqlite:///mydb.sqlite')
SQLite umożliwia tworzenie bazy danych w pamięci. Silnik SQLAlchemy dla bazy danych w pamięci jest tworzony w następujący sposób -
from sqlalchemy import create_engine
engine=create_engine('sqlite:///:memory:')
Jeśli zamiast tego zamierzasz używać bazy danych MySQL, użyj jej modułu DB-API - pymysql i odpowiedniego sterownika dialektu.
engine = create_engine('mysql+pymydsql://root@localhost/mydb')
Create_engine ma opcjonalny argument echo. Jeśli ma wartość true, zapytania SQL generowane przez silnik będą powtarzane na terminalu.
SQLAlchemy zawiera declarative baseklasa. Działa jako katalog klas modeli i mapowanych tabel.
from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()
Następnym krokiem jest zdefiniowanie klasy modelu. Musi być wyprowadzony z obiektu bazowego klasy declarative_base jak wyżej.
Ustaw __tablename__ na nazwę tabeli, którą chcesz utworzyć w bazie danych. Inne atrybuty odpowiadają polom. Każdy z nich jest obiektem Column w SQLAlchemy, a jego typ danych pochodzi z jednej z poniższych list -
- BigInteger
- Boolean
- Date
- DateTime
- Float
- Integer
- Numeric
- SmallInteger
- String
- Text
- Time
Poniższy kod to klasa modelu o nazwie Student, która jest zamapowana na tabelę Students.
#myclasses.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Numeric
base=declarative_base()
class Student(base):
__tablename__='Students'
StudentID=Column(Integer, primary_key=True)
name=Column(String)
age=Column(Integer)
marks=Column(Numeric)
Aby utworzyć tabelę Students, która ma odpowiednią strukturę, wykonaj metodę create_all () zdefiniowaną dla klasy bazowej.
base.metadata.create_all(engine)
Teraz musimy zadeklarować obiekt naszej klasy Student. Wszystkie transakcje bazy danych, takie jak dodawanie, usuwanie lub pobieranie danych z bazy danych itp., Są obsługiwane przez obiekt Session.
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
Dane przechowywane w obiekcie Studenta są fizycznie dodawane do tabeli bazowej za pomocą metody add () sesji.
s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()
Tutaj jest cały kod dodawania rekordu w tabeli uczniów. Podczas wykonywania odpowiedni dziennik instrukcji SQL jest wyświetlany na konsoli.
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from myclasses import Student, base
engine = create_engine('sqlite:///college.db', echo=True)
base.metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()
Wyjście konsoli
CREATE TABLE "Students" (
"StudentID" INTEGER NOT NULL,
name VARCHAR,
age INTEGER,
marks NUMERIC,
PRIMARY KEY ("StudentID")
)
INFO sqlalchemy.engine.base.Engine ()
INFO sqlalchemy.engine.base.Engine COMMIT
INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
INFO sqlalchemy.engine.base.Engine INSERT INTO "Students" (name, age, marks) VALUES (?, ?, ?)
INFO sqlalchemy.engine.base.Engine ('Juhi', 25, 200.0)
INFO sqlalchemy.engine.base.Engine COMMIT
Plik session obiekt udostępnia również metodę add_all () do wstawiania więcej niż jednego obiektu w jednej transakcji.
sessionobj.add_all([s2,s3,s4,s5])
sessionobj.commit()
Teraz, gdy rekordy zostały dodane do tabeli, chcielibyśmy je z niej pobrać, tak jak robi to zapytanie SELECT. Obiekt sesji ma metodę query () do wykonania zadania. Obiekt zapytania jest zwracany przez metodę query () w naszym modelu Studenta.
qry=seesionobj.query(Student)
Użyj metody get () tego obiektu Query, aby pobrać obiekt odpowiadający podanemu kluczowi głównemu.
S1=qry.get(1)
Podczas wykonywania tej instrukcji odpowiadająca jej instrukcja SQL wyświetlana na konsoli będzie wyglądać następująco:
BEGIN (implicit)
SELECT "Students"."StudentID" AS "Students_StudentID", "Students".name AS
"Students_name", "Students".age AS "Students_age",
"Students".marks AS "Students_marks"
FROM "Students"
WHERE "Products"."Students" = ?
sqlalchemy.engine.base.Engine (1,)
Metoda query.all () zwraca listę wszystkich obiektów, po których można przejść za pomocą pętli.
from sqlalchemy import Column, Integer, String, Numeric
from sqlalchemy import create_engine
from myclasses import Student,base
engine = create_engine('sqlite:///college.db', echo=True)
base.metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
qry=sessionobj.query(Students)
rows=qry.all()
for row in rows:
print (row)
Aktualizacja rekordu w zmapowanej tabeli jest bardzo łatwa. Wystarczy pobrać rekord metodą get (), przypisać nową wartość do żądanego atrybutu, a następnie zatwierdzić zmiany za pomocą obiektu sesji. Poniżej zmieniamy oceny ucznia Juhi na 100.
S1=qry.get(1)
S1.marks=100
sessionobj.commit()
Usunięcie rekordu jest równie łatwe, poprzez usunięcie żądanego obiektu z sesji.
S1=qry.get(1)
Sessionobj.delete(S1)
sessionobj.commit()
MongoDB jest zorientowanym na dokumenty NoSQLBaza danych. Jest to wieloplatformowa baza danych rozpowszechniana na licencji publicznej po stronie serwera. Używa dokumentów podobnych do JSON jako schematu.
Aby zapewnić możliwość przechowywania ogromnych danych, łączy się ze sobą więcej niż jeden serwer fizyczny (zwany shardami), dzięki czemu uzyskuje się skalowalność poziomą. Baza danych MongoDB składa się z dokumentów.
Dokument jest analogiczny do wiersza w tabeli relacyjnej bazy danych. Jednak nie ma określonego schematu. Dokument to zbiór par klucz-wartość - podobnie jak w słowniku. Jednak liczba par kv w każdym dokumencie może się różnić. Tak jak tabela w relacyjnej bazie danych ma klucz podstawowy, tak dokument w bazie danych MongoDB ma specjalny klucz o nazwie"_id".
Zanim zobaczymy, w jaki sposób baza danych MongoDB jest używana z Pythonem, pokrótce wyjaśnijmy, jak zainstalować i uruchomić MongoDB. Dostępna jest społeczna i komercyjna wersja MongoDB. Wersję społeczności można pobrać ze strony www.mongodb.com/download-center/community .
Zakładając, że MongoDB jest zainstalowane w c: \ mongodb, serwer można wywołać za pomocą następującego polecenia.
c:\mongodb\bin>mongod
Serwer MongoDB jest domyślnie aktywny pod numerem portu 22017. Bazy danych są domyślnie przechowywane w folderze data / bin, chociaż lokalizację można zmienić opcją –dbpath.
MongoDB ma własny zestaw poleceń, których można używać w powłoce MongoDB. Aby wywołać powłokę, użyjMongo Komenda.
x:\mongodb\bin>mongo
Pojawia się zachęta powłoki podobna do zachęty powłoki MySQL lub SQLite, przed którą można wykonać natywne polecenia NoSQL. Nas jednak interesuje podłączenie bazy danych MongoDB do Pythona.
PyMongomoduł został opracowany przez samą MongoDB Inc w celu zapewnienia interfejsu programowania Python. Użyj dobrze znanego narzędzia pip, aby zainstalować PyMongo.
pip3 install pymongo
Zakładając, że serwer MongoDB działa i działa (z mongod polecenie) i nasłuchuje na porcie 22017, najpierw musimy zadeklarować plik MongoClientobiekt. Kontroluje wszystkie transakcje między sesją Pythona a bazą danych.
from pymongo import MongoClient
client=MongoClient()
Użyj tego obiektu klienta, aby nawiązać połączenie z serwerem MongoDB.
client = MongoClient('localhost', 27017)
Nowa baza danych jest tworzona za pomocą następującego polecenia.
db=client.newdb
Baza danych MongoDB może mieć wiele kolekcji, podobnie jak tabele w relacyjnej bazie danych. Obiekt Collection jest tworzony przezCreate_collection() funkcjonować.
db.create_collection('students')
Teraz możemy dodać jeden lub więcej dokumentów do kolekcji w następujący sposób -
from pymongo import MongoClient
client=MongoClient()
db=client.newdb
db.create_collection("students")
student=db['students']
studentlist=[{'studentID':1,'Name':'Juhi','age':20, 'marks'=100},
{'studentID':2,'Name':'dilip','age':20, 'marks'=110},
{'studentID':3,'Name':'jeevan','age':24, 'marks'=145}]
student.insert_many(studentlist)
client.close()
Aby pobrać dokumenty (podobnie jak w zapytaniu SELECT), powinniśmy użyć find()metoda. Zwraca kursor, za pomocą którego można uzyskać wszystkie dokumenty.
students=db['students']
docs=students.find()
for doc in docs:
print (doc['Name'], doc['age'], doc['marks'] )
Aby znaleźć konkretny dokument zamiast wszystkich w kolekcji, musimy zastosować filtr do metody find (). Filtr używa operatorów logicznych. MongoDB ma własny zestaw operatorów logicznych, jak poniżej -
Sr.No | Operator MongoDB i tradycyjny operator logiczny |
---|---|
1 | $eq równe (==) |
2 | $gt większe niż (>) |
3 | $gte większy lub równy (> =) |
4 | $in jeśli jest równa dowolnej wartości w tablicy |
5 | $lt mniej niż (<) |
6 | $lte mniejszy lub równy (<=) |
7 | $ne różne od (! =) |
8 | $nin jeśli nie jest równa żadnej wartości w tablicy |
Na przykład jesteśmy zainteresowani uzyskaniem listy uczniów starszych niż 21 lat. Użycie operatora $ gt w filtrze dlafind() metoda w następujący sposób -
students=db['students']
docs=students.find({'age':{'$gt':21}})
for doc in docs:
print (doc.get('Name'), doc.get('age'), doc.get('marks'))
Moduł PyMongo zapewnia update_one() i update_many() metody modyfikowania jednego dokumentu lub więcej niż jednego dokumentu spełniającego określone wyrażenie filtru.
Zaktualizujmy atrybut znaków dokumentu o nazwie Juhi.
from pymongo import MongoClient
client=MongoClient()
db=client.newdb
doc=db.students.find_one({'Name': 'Juhi'})
db['students'].update_one({'Name': 'Juhi'},{"$set":{'marks':150}})
client.close()
Cassandra to kolejna popularna baza danych NoSQL. Wysoka skalowalność, spójność i odporność na błędy - to tylko niektóre z ważnych cech Cassandry. To jestColumn storeBaza danych. Dane są przechowywane na wielu serwerach towarowych. W rezultacie dane są wysoce dostępne.
Cassandra to produkt fundacji Apache Software. Dane są przechowywane w sposób rozproszony w wielu węzłach. Każdy węzeł to pojedynczy serwer składający się z przestrzeni kluczy. Podstawowym elementem składowym bazy danych Cassandra jestkeyspace które można uznać za analogiczne do bazy danych.
Dane w jednym węźle Cassandry są replikowane w innych węzłach za pośrednictwem sieci węzłów peer-to-peer. To sprawia, że Cassandra jest niezawodną bazą danych. Sieć nazywana jest centrum danych. Wiele centrów danych może być połączonych ze sobą, tworząc klaster. Charakter replikacji jest konfigurowany przez ustawienie strategii replikacji i współczynnika replikacji w momencie tworzenia obszaru kluczy.
Jedna przestrzeń kluczowa może mieć więcej niż jedną rodzinę kolumn - tak jak jedna baza danych może zawierać wiele tabel. Przestrzeń klawiszy Cassandry nie ma wstępnie zdefiniowanego schematu. Możliwe, że każdy wiersz w tabeli Cassandra może mieć kolumny o różnych nazwach i zmiennych liczbach.
Oprogramowanie Cassandra jest również dostępne w dwóch wersjach: społecznościowej i korporacyjnej. Najnowsza wersja aplikacji Cassandra dla przedsiębiorstw jest dostępna do pobrania pod adresemhttps://cassandra.apache.org/download/. Wydanie społeczności znajduje się pod adresemhttps://academy.datastax.com/planet-cassandra/cassandra.
Cassandra ma własny język zapytań o nazwie Cassandra Query Language (CQL). Zapytania CQL można wykonywać z wnętrza powłoki CQLASH - podobnie jak w powłoce MySQL lub SQLite. Składnia języka CQL wygląda podobnie do standardowego języka SQL.
Wydanie społecznościowe Datastax jest również dostarczane z Develcenter IDE pokazanym na poniższym rysunku -
Nazywa się moduł Pythona do pracy z bazą danych Cassandra Cassandra Driver. Jest również rozwijany przez fundację Apache. Ten moduł zawiera ORM API, a także rdzeń API podobny w naturze do DB-API dla relacyjnych baz danych.
Instalację sterownika Cassandra można łatwo wykonać za pomocą pip utility.
pip3 install cassandra-driver
Interakcja z bazą danych Cassandra odbywa się za pośrednictwem obiektu Cluster. Moduł Cassandra.cluster definiuje klasę Cluster. Najpierw musimy zadeklarować obiekt Cluster.
from cassandra.cluster import Cluster
clstr=Cluster()
Wszystkie transakcje, takie jak wstawianie / aktualizowanie itp., Są wykonywane przez rozpoczęcie sesji z przestrzenią kluczy.
session=clstr.connect()
Aby utworzyć nową przestrzeń klawiszy, użyj execute()metoda obiektu sesji. Metoda execute () przyjmuje argument typu string, który musi być ciągiem zapytania. CQL ma instrukcję CREATE KEYSPACE w następujący sposób. Pełny kod jest jak poniżej -
from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect()
session.execute(“create keyspace mykeyspace with replication={
'class': 'SimpleStrategy', 'replication_factor' : 3
};”
Tutaj, SimpleStrategy jest wartością dla replication strategy i replication factorjest ustawiona na 3. Jak wspomniano wcześniej, obszar kluczy zawiera jedną lub więcej tabel. Każda tabela charakteryzuje się typem danych. Typy danych Python są automatycznie analizowane z odpowiednimi typami danych CQL zgodnie z poniższą tabelą -
Typ Pythona | Typ CQL |
---|---|
Żaden | ZERO |
Bool | Boolean |
Pływak | pływak, podwójny |
int, long | int, bigint, varint, smallint, tinyint, counter |
decimal.Decimal | Dziesiętny |
str, Unicode | ascii, varchar, tekst |
bufor, bytearray | Kropelka |
Data | Data |
Datetime | Znak czasu |
Czas | Czas |
lista, krotka, generator | Lista |
zestaw, zamrożony | Zestaw |
dict, OrderedDict | Mapa |
uuid.UUID | timeuuid, uuid |
Aby utworzyć tabelę, użyj obiektu sesji do wykonania zapytania CQL w celu utworzenia tabeli.
from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
qry= '''
create table students (
studentID int,
name text,
age int,
marks int,
primary key(studentID)
);'''
session.execute(qry)
Tak utworzony obszar kluczy może być dalej używany do wstawiania wierszy. Wersja CQL zapytania INSERT jest podobna do instrukcji SQL Insert. Poniższy kod wstawia wiersz w tabeli uczniów.
from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
session.execute("insert into students (studentID, name, age, marks) values
(1, 'Juhi',20, 200);"
Jak można się spodziewać, instrukcja SELECT jest również używana z Cassandrą. W przypadku metody execute () zawierającej ciąg zapytania SELECT, zwraca ona obiekt zestawu wyników, po którym można przejść za pomocą pętli.
from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
rows=session.execute("select * from students;")
for row in rows:
print (StudentID: {} Name:{} Age:{} price:{} Marks:{}'
.format(row[0],row[1], row[2], row[3]))
Zapytanie SELECT Cassandry obsługuje użycie klauzuli WHERE w celu zastosowania filtru do zestawu wyników do pobrania. Rozpoznawane są tradycyjne operatory logiczne, takie jak <,> == itd. Aby pobrać tylko te wiersze z tabeli uczniów dla nazwisk w wieku> 20 lat, ciąg zapytania w metodzie execute () powinien wyglądać następująco -
rows=session.execute("select * from students WHERE age>20 allow filtering;")
Uwaga, użycie ALLOW FILTERING. Część ALLOW FILTERING tej instrukcji umożliwia jawne zezwolenie na (niektóre) zapytania, które wymagają filtrowania.
Interfejs API sterownika Cassandra definiuje następujące klasy typu Statement w swoim module cassendra.query.
SimpleStatement
Proste, nieprzygotowane zapytanie CQL zawarte w ciągu zapytania. Wszystkie powyższe przykłady są przykładami SimpleStatement.
BatchStatement
Wiele zapytań (takich jak INSERT, UPDATE i DELETE) jest umieszczanych w partii i wykonywanych jednocześnie. Każdy wiersz jest najpierw konwertowany jako SimpleStatement, a następnie dodawany w partii.
Umieśćmy wiersze do dodania w tabeli Uczniów w postaci listy krotek w następujący sposób -
studentlist=[(1,'Juhi',20,100), ('2,'dilip',20, 110),(3,'jeevan',24,145)]
Aby dodać powyższe wiersze za pomocą BathStatement, uruchom następujący skrypt -
from cassandra.query import SimpleStatement, BatchStatement
batch=BatchStatement()
for student in studentlist:
batch.add(SimpleStatement("INSERT INTO students
(studentID, name, age, marks) VALUES
(%s, %s, %s %s)"), (student[0], student[1],student[2], student[3]))
session.execute(batch)
Przygotowane oświadczenie
Prepared Statement jest jak sparametryzowane zapytanie w DB-API. Jego ciąg zapytania jest zapisywany przez Cassandrę do późniejszego użycia. Metoda Session.prepare () zwraca instancję PreparedStatement.
W przypadku tabeli naszych studentów, PreparedStatement for INSERT jest następująca:
stmt=session.prepare("INSERT INTO students (studentID, name, age, marks) VALUES (?,?,?)")
Następnie wystarczy wysłać wartości parametrów do powiązania. Na przykład -
qry=stmt.bind([1,'Ram', 23,175])
Na koniec wykonaj powyższą instrukcję bound.
session.execute(qry)
Zmniejsza to ruch w sieci i wykorzystanie procesora, ponieważ Cassandra nie musi za każdym razem ponownie analizować zapytania.
ZODB (Zope object Database) to baza danych do przechowywania obiektów Pythona. Jest zgodny z ACID - funkcja nie występuje w bazach danych NOSQL. ZODB jest również open source, skalowalny w poziomie i wolny od schematów, podobnie jak wiele baz danych NoSQL. Jednak nie jest rozpowszechniany i nie zapewnia łatwej replikacji. Zapewnia mechanizm trwałości dla obiektów Pythona. Jest częścią serwera Zope Application, ale może być również używany niezależnie.
ZODB został stworzony przez Jima Fultona z Zope Corporation. Zaczęło się od prostego Persistent Object System. Jego aktualna wersja to 5.5.0 i jest napisana w całości w Pythonie. używając rozszerzonej wersji wbudowanej trwałości obiektów Pythona (pickle).
Niektóre z głównych cech ZODB to -
- transactions
- history/undo
- przezroczyste miejsce do przechowywania
- wbudowane buforowanie
- kontrola współbieżności wielu wersji (MVCC)
- skalowalność w całej sieci
ZODB to hierarchicalBaza danych. Istnieje obiekt główny, inicjowany podczas tworzenia bazy danych. Obiekt główny jest używany jak słownik Pythona i może zawierać inne obiekty (które mogą być podobne do słownika). Aby przechowywać obiekt w bazie danych wystarczy przypisać go do nowego klucza wewnątrz jego kontenera.
ZODB jest przydatny w aplikacjach, w których dane są hierarchiczne i prawdopodobnie będzie więcej odczytów niż zapisów. ZODB jest rozszerzeniem obiektu pikle. Dlatego można go przetwarzać tylko za pomocą skryptu Python.
Aby zainstalować najnowszą wersję ZODB, użyj narzędzia pip -
pip install zodb
Następujące zależności są również instalowane -
- BTrees==4.6.1
- cffi==1.13.2
- persistent==4.5.1
- pycparser==2.19
- six==1.13.0
- transaction==2.4.0
ZODB zapewnia następujące opcje przechowywania -
Nośnik danych
To jest ustawienie domyślne. Wszystko jest przechowywane w jednym pliku Big Data.fs, który jest zasadniczo dziennikiem transakcji.
DirectoryStorage
To przechowuje jeden plik na wersję obiektu. W tym przypadku nie wymaga odbudowy Data.fs.index po nieczystym zamknięciu.
RelStorage
To przechowuje pikle w relacyjnej bazie danych. Obsługiwane są PostgreSQL, MySQL i Oracle.
Do stworzenia bazy danych ZODB potrzebujemy magazynu, bazy danych i wreszcie połączenia.
Pierwszym krokiem jest posiadanie obiektu pamięci.
import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('mydata.fs')
Klasa DB używa tego obiektu pamięci do uzyskania obiektu bazy danych.
db = ZODB.DB(storage)
Przekaż None do konstruktora DB, aby utworzyć bazę danych w pamięci.
Db=ZODB.DB(None)
Wreszcie nawiązujemy połączenie z bazą danych.
conn=db.open()
Obiekt połączenia zapewnia następnie dostęp do „katalogu głównego” bazy danych za pomocą metody „root ()”. Obiekt „root” to słownik, który zawiera wszystkie trwałe obiekty.
root = conn.root()
Na przykład dodajemy listę uczniów do obiektu głównego w następujący sposób -
root['students'] = ['Mary', 'Maya', 'Meet']
Ta zmiana nie jest trwale zapisywana w bazie danych, dopóki nie zatwierdzimy transakcji.
import transaction
transaction.commit()
Aby przechowywać obiekt klasy zdefiniowanej przez użytkownika, klasa ta musi być dziedziczona z trwałej klasy nadrzędnej.
Zalety podklasowania
Podklasa Trwała klasa ma następujące zalety -
Baza danych będzie automatycznie śledzić zmiany obiektów wprowadzone przez ustawienie atrybutów.
Dane zostaną zapisane we własnym rekordzie bazy danych.
Możesz zapisać dane, które nie są podklasą Trwałe, ale będą przechowywane w rekordzie bazy danych dowolnego trwałego obiektu, do którego się odwołuje. Obiekty nietrwałe są własnością ich trwałego obiektu zawierającego i jeśli wiele trwałych obiektów odwołuje się do tego samego nietrwałego podobiektu, otrzymają one własne kopie.
Użyjmy zdefiniuj podklasę klasy studenta Trwałą klasę jako poniżej -
import persistent
class student(persistent.Persistent):
def __init__(self, name):
self.name = name
def __repr__(self):
return str(self.name)
Aby dodać obiekt tej klasy, najpierw skonfigurujmy połączenie zgodnie z powyższym opisem.
import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('studentdata.fs')
db = ZODB.DB(storage)
conn=db.open()
root = conn.root()
Zadeklaruj obiekt jako add do roota, a następnie zatwierdź transakcję
s1=student("Akash")
root['s1']=s1
import transaction
transaction.commit()
conn.close()
Listę wszystkich obiektów dodanych do roota można pobrać jako obiekt widoku za pomocą metody items (), ponieważ obiekt root jest podobny do wbudowanego słownika.
print (root.items())
ItemsView({'s1': Akash})
Aby pobrać atrybut konkretnego obiektu z katalogu głównego,
print (root['s1'].name)
Akash
Obiekt można łatwo zaktualizować. Ponieważ ZODB API jest czystym pakietem Pythona, nie wymaga używania żadnego zewnętrznego języka typu SQL.
root['s1'].name='Abhishek'
import transaction
transaction.commit()
Baza danych zostanie natychmiast zaktualizowana. Zauważ, że klasa transakcji definiuje również funkcję abort (), która jest podobna do kontroli transakcji rollback () w SQL.
Microsoft Excel to najpopularniejsza aplikacja do obsługi arkuszy kalkulacyjnych. Jest używany od ponad 25 lat. Późniejsze wersje programu Excel używająOffice Open XML (OOXML) format pliku. W związku z tym był możliwy dostęp do plików arkuszy kalkulacyjnych za pośrednictwem innych środowisk programistycznych.
OOXMLto standardowy format plików ECMA. Pythonaopenpyxl Pakiet zapewnia funkcjonalność odczytu / zapisu plików Excel z rozszerzeniem .xlsx.
Pakiet openpyxl używa nazewnictwa klas podobnego do terminologii Microsoft Excel. Dokument programu Excel jest nazywany skoroszytem i jest zapisywany z rozszerzeniem .xlsx w systemie plików. Skoroszyt może zawierać wiele arkuszy. Arkusz zawiera dużą siatkę komórek, z których każda może przechowywać wartość lub formułę. Wiersze i kolumny tworzące siatkę są numerowane. Kolumny są identyfikowane za pomocą alfabetów, A, B, C,…, Z, AA, AB i tak dalej. Wiersze są numerowane począwszy od 1.
Typowy arkusz programu Excel wygląda następująco -
Narzędzie pip jest wystarczająco dobre, aby zainstalować pakiet openpyxl.
pip install openpyxl
Klasa Workbook reprezentuje pusty skoroszyt z jednym pustym arkuszem. Musimy go aktywować, aby można było dodać niektóre dane do arkusza.
from openpyxl import Workbook
wb=Workbook()
sheet1=wb.active
sheet1.title='StudentList'
Jak wiemy, komórka w arkuszu nosi nazwę w formacie ColumnNameRownumber. Odpowiednio, lewa górna komórka to A1. Przypisujemy ciąg do tej komórki jako -
sheet1['A1']= 'Student List'
Alternatywnie użyj arkusza roboczego cell()metoda, która wykorzystuje numer wiersza i kolumny do identyfikacji komórki. Wywołaj właściwość value do obiektu komórki, aby przypisać wartość.
cell1=sheet1.cell(row=1, column=1)
cell1.value='Student List'
Po wypełnieniu arkusza danymi skoroszyt jest zapisywany przez wywołanie metody save () obiektu skoroszytu.
wb.save('Student.xlsx')
Ten plik skoroszytu jest tworzony w bieżącym katalogu roboczym.
Poniższy skrypt w języku Python zapisuje listę krotek w dokumencie skoroszytu. Każda krotka przechowuje numer rolki, wiek i oceny ucznia.
from openpyxl import Workbook
wb = Workbook()
sheet1 = wb.active
sheet1.title='Student List'
sheet1.cell(column=1, row=1).value='Student List'
studentlist=[('RollNo','Name', 'age', 'marks'),(1,'Juhi',20,100),
(2,'dilip',20, 110) , (3,'jeevan',24,145)]
for col in range(1,5):
for row in range(1,5):
sheet1.cell(column=col, row=1+row).value=studentlist[row-1][col-1]
wb.save('students.xlsx')
Skoroszyt Students.xlsx jest zapisywany w bieżącym katalogu roboczym. Po otwarciu za pomocą aplikacji Excel wygląda jak poniżej -
Moduł openpyxl oferuje load_workbook() funkcja, która pomaga w odczytaniu danych w dokumencie skoroszytu.
from openpyxl import load_workbook
wb=load_workbook('students.xlsx')
Możesz teraz uzyskać dostęp do wartości dowolnej komórki określonej przez numer wiersza i kolumny.
cell1=sheet1.cell(row=1, column=1)
print (cell1.value)
Student List
Przykład
Poniższy kod wypełnia listę danymi arkusza roboczego.
from openpyxl import load_workbook
wb=load_workbook('students.xlsx')
sheet1 = wb['Student List']
studentlist=[]
for row in range(1,5):
stud=[]
for col in range(1,5):
val=sheet1.cell(column=col, row=1+row).value
stud.append(val)
studentlist.append(tuple(stud))
print (studentlist)
Wynik
[('RollNo', 'Name', 'age', 'marks'), (1, 'Juhi', 20, 100), (2, 'dilip', 20, 110), (3, 'jeevan', 24, 145)]
Bardzo ważną cechą programu Excel jest formuła. Aby przypisać formułę do komórki, przypisz ją do ciągu zawierającego składnię formuły programu Excel. Przypisz funkcję ŚREDNIA do komórki c6 mającej wiek.
sheet1['C6']= 'AVERAGE(C3:C5)'
Moduł Openpyxl ma Translate_formula()funkcja, aby skopiować formułę w zakresie. Poniższy program definiuje funkcję ŚREDNIA w C6 i kopiuje ją do C7, która oblicza średnią ocen.
from openpyxl import load_workbook
wb=load_workbook('students.xlsx')
sheet1 = wb['Student List']
from openpyxl.formula.translate import Translator#copy formula
sheet1['B6']='Average'
sheet1['C6']='=AVERAGE(C3:C5)'
sheet1['D6'] = Translator('=AVERAGE(C3:C5)', origin="C6").translate_formula("D6")
wb.save('students.xlsx')
Zmieniony arkusz roboczy wygląda teraz następująco -