Python Data Persistence - คู่มือฉบับย่อ

ภาพรวมของ Python - ความคงอยู่ของข้อมูล

ในระหว่างการใช้แอพพลิเคชั่นซอฟต์แวร์ใด ๆ ผู้ใช้จะให้ข้อมูลบางอย่างที่ต้องดำเนินการ ข้อมูลอาจถูกป้อนโดยใช้อุปกรณ์อินพุตมาตรฐาน (แป้นพิมพ์) หรืออุปกรณ์อื่น ๆ เช่นไฟล์ดิสก์สแกนเนอร์กล้องสายเคเบิลเครือข่ายการเชื่อมต่อ WiFi เป็นต้น

ข้อมูลที่ได้รับจะถูกเก็บไว้ในหน่วยความจำหลัก (RAM) ของคอมพิวเตอร์ในรูปแบบของโครงสร้างข้อมูลต่างๆเช่นตัวแปรและวัตถุจนกว่าแอปพลิเคชันจะทำงาน หลังจากนั้นเนื้อหาหน่วยความจำจาก RAM จะถูกลบ

อย่างไรก็ตามบ่อยครั้งกว่าที่จะไม่ต้องการให้เก็บค่าของตัวแปรและ / หรืออ็อบเจกต์ในลักษณะดังกล่าวเพื่อให้สามารถเรียกดูได้ทุกเมื่อที่ต้องการแทนที่จะป้อนข้อมูลเดิมอีกครั้ง

คำว่า 'ความคงอยู่' หมายถึง "ความต่อเนื่องของผลกระทบหลังจากที่สาเหตุถูกลบออก" คำว่าการคงอยู่ของข้อมูลหมายความว่าข้อมูลยังคงมีอยู่แม้ว่าแอปพลิเคชันจะสิ้นสุดลงแล้วก็ตาม ดังนั้นข้อมูลที่จัดเก็บในสื่อเก็บข้อมูลที่ไม่ลบเลือนเช่นไฟล์ดิสก์จึงเป็นที่เก็บข้อมูลถาวร

ในบทช่วยสอนนี้เราจะสำรวจโมดูล Python ในตัวและของบุคคลที่สามต่างๆเพื่อจัดเก็บและดึงข้อมูลไปยัง / จากรูปแบบต่างๆเช่นไฟล์ข้อความ, ไฟล์ CSV, JSON และ XML รวมถึงฐานข้อมูลเชิงสัมพันธ์และไม่ใช่เชิงสัมพันธ์

การใช้ออบเจ็กต์ File ในตัวของ Python สามารถเขียนข้อมูลสตริงลงในไฟล์ดิสก์และอ่านข้อมูลได้ ไลบรารีมาตรฐานของ Python มีโมดูลในการจัดเก็บและดึงข้อมูลอนุกรมในโครงสร้างข้อมูลต่างๆเช่น JSON และ XML

DB-API ของ Python เป็นวิธีมาตรฐานในการโต้ตอบกับฐานข้อมูลเชิงสัมพันธ์ แพ็คเกจ Python ของบุคคลที่สามอื่น ๆ นำเสนอฟังก์ชันการเชื่อมต่อกับฐานข้อมูล NOSQL เช่น MongoDB และ Cassandra

บทช่วยสอนนี้ยังแนะนำฐานข้อมูล ZODB ซึ่งเป็น API ที่คงอยู่สำหรับวัตถุ Python รูปแบบ Microsoft Excel เป็นรูปแบบไฟล์ข้อมูลที่ได้รับความนิยมมาก ในบทช่วยสอนนี้เราจะเรียนรู้วิธีจัดการไฟล์. xlsx ผ่าน Python

Python ใช้ในตัว input() และ print()ฟังก์ชั่นเพื่อดำเนินการอินพุต / เอาต์พุตมาตรฐาน ฟังก์ชัน input () อ่านไบต์จากอุปกรณ์สตรีมอินพุตมาตรฐานเช่นแป้นพิมพ์

print()ในทางกลับกันส่งข้อมูลไปยังอุปกรณ์สตรีมเอาท์พุตมาตรฐานเช่นจอภาพแสดงผล โปรแกรม Python โต้ตอบกับอุปกรณ์ IO เหล่านี้ผ่านอ็อบเจ็กต์สตรีมมาตรฐานstdin และ stdout กำหนดไว้ในโมดูล sys

input()ฟังก์ชั่นเป็นกระดาษห่อหุ้มรอบ readline () วิธีการของวัตถุ sys.stdin การกดแป้นพิมพ์ทั้งหมดจากสตรีมอินพุตจะได้รับจนกว่าจะกดปุ่ม 'Enter'

>>> import sys
>>> x=sys.stdin.readline()
Welcome to TutorialsPoint
>>> x
'Welcome to TutorialsPoint\n'

โปรดทราบว่า readline()ฟังก์ชันเว้นอักขระ '\ n' ต่อท้าย นอกจากนี้ยังมีวิธีการอ่าน () ซึ่งอ่านข้อมูลจากสตรีมอินพุตมาตรฐานจนกว่าจะสิ้นสุดโดยCtrl+D ตัวละคร.

>>> x=sys.stdin.read()
Hello
Welcome to TutorialsPoint
>>> x
'Hello\nWelcome to TutorialsPoint\n'

ในทำนองเดียวกัน print() เป็นฟังก์ชันอำนวยความสะดวกที่เลียนแบบวิธีการเขียน () ของวัตถุ stdout

>>> x='Welcome to TutorialsPoint\n'
>>> sys.stdout.write(x)
Welcome to TutorialsPoint
26

เช่นเดียวกับออบเจ็กต์สตรีมที่กำหนดไว้ล่วงหน้า stdin และ stdout โปรแกรม Python สามารถอ่านข้อมูลและส่งข้อมูลไปยังไฟล์ดิสก์หรือซ็อกเก็ตเครือข่าย พวกเขายังเป็นสตรีม อ็อบเจ็กต์ใด ๆ ที่มีเมธอด read () คืออินพุตสตรีม อ็อบเจ็กต์ใด ๆ ที่มีเมธอด write () คือเอาต์พุตสตรีม การสื่อสารกับสตรีมถูกสร้างขึ้นโดยการอ้างถึงอ็อบเจ็กต์สตรีมที่มีฟังก์ชัน open () ในตัว

เปิด () ฟังก์ชั่น

ฟังก์ชันในตัวนี้ใช้อาร์กิวเมนต์ต่อไปนี้ -

f=open(name, mode, buffering)

พารามิเตอร์ name เป็นชื่อของไฟล์ดิสก์หรือสตริงไบต์โหมดเป็นสตริงอักขระหนึ่งตัวเลือกเพื่อระบุประเภทของการดำเนินการที่จะดำเนินการ (อ่านเขียนผนวก ฯลฯ ) และพารามิเตอร์บัฟเฟอร์คือ 0, 1 หรือ -1 ระบุ บัฟเฟอร์ปิดอยู่หรือระบบเริ่มต้น

โหมดการเปิดไฟล์จะแจกแจงตามตารางด้านล่าง โหมดเริ่มต้นคือ 'r'

ซีเนียร์ No พารามิเตอร์และคำอธิบาย
1

R

เปิดสำหรับการอ่าน (ค่าเริ่มต้น)

2

W

เปิดสำหรับการเขียนตัดทอนไฟล์ก่อน

3

X

สร้างไฟล์ใหม่และเปิดเพื่อเขียน

4

A

เปิดสำหรับการเขียนต่อท้ายไฟล์หากมีอยู่

5

B

โหมดไบนารี

6

T

โหมดข้อความ (ค่าเริ่มต้น)

7

+

เปิดไฟล์ดิสก์เพื่ออัปเดต (อ่านและเขียน)

ในการบันทึกข้อมูลลงในไฟล์จะต้องเปิดด้วยโหมด 'w'

f=open('test.txt','w')

อ็อบเจ็กต์ไฟล์นี้ทำหน้าที่เป็นเอาต์พุตสตรีมและสามารถเข้าถึงเมธอด write () เมธอด write () ส่งสตริงไปยังอ็อบเจ็กต์นี้และถูกเก็บไว้ในไฟล์ที่อยู่ภายใต้

string="Hello TutorialsPoint\n"
f.write(string)

สิ่งสำคัญคือต้องปิดสตรีมเพื่อให้แน่ใจว่าข้อมูลที่เหลืออยู่ในบัฟเฟอร์จะถูกถ่ายโอนไปยังข้อมูลนั้นอย่างสมบูรณ์

file.close()

ลองและเปิด 'test.txt' โดยใช้ตัวแก้ไขการทดสอบ (เช่น notepad) เพื่อยืนยันว่าสร้างไฟล์สำเร็จ

หากต้องการอ่านเนื้อหาของ 'test.txt' โดยทางโปรแกรมจะต้องเปิดในโหมด 'r'

f=open('test.txt','r')

วัตถุนี้ทำงานเป็นสตรีมอินพุต Python สามารถดึงข้อมูลจากสตรีมโดยใช้ไฟล์read() วิธี.

string=f.read()
print (string)

เนื้อหาของไฟล์จะแสดงบนคอนโซล Python วัตถุไฟล์ยังรองรับreadline() วิธีที่สามารถอ่านสตริงได้จนกว่าจะพบอักขระ EOF

อย่างไรก็ตามหากเปิดไฟล์เดียวกันในโหมด 'w' เพื่อจัดเก็บข้อความเพิ่มเติมในนั้นเนื้อหาก่อนหน้านี้จะถูกลบ เมื่อใดก็ตามที่ไฟล์ถูกเปิดโดยได้รับอนุญาตให้เขียนไฟล์นั้นจะถือว่าเป็นไฟล์ใหม่ ในการเพิ่มข้อมูลลงในไฟล์ที่มีอยู่ให้ใช้ "a" สำหรับโหมดผนวก

f=open('test.txt','a')
f.write('Python Tutorials\n')

ตอนนี้ไฟล์มีสตริงก่อนหน้านี้และเพิ่งเพิ่มใหม่ วัตถุไฟล์ยังรองรับwritelines() วิธีการเขียนแต่ละสตริงในวัตถุรายการไปยังไฟล์

f=open('test.txt','a')
lines=['Java Tutorials\n', 'DBMS tutorials\n', 'Mobile development tutorials\n']
f.writelines(lines)
f.close()

ตัวอย่าง

readlines()วิธีการส่งคืนรายการของสตริงโดยแต่ละรายการจะแสดงบรรทัดในไฟล์ นอกจากนี้ยังสามารถอ่านไฟล์ทีละบรรทัดจนกว่าจะถึงจุดสิ้นสุดของไฟล์

f=open('test.txt','r')
while True:
   line=f.readline()
   if line=='' : break
   print (line, end='')
f.close()

เอาต์พุต

Hello TutorialsPoint
Python Tutorials
Java Tutorials
DBMS tutorials
Mobile development tutorials

โหมดไบนารี

ตามค่าเริ่มต้นการดำเนินการอ่าน / เขียนบนอ็อบเจ็กต์ไฟล์จะดำเนินการกับข้อมูลสตริงข้อความ หากเราต้องการจัดการไฟล์ประเภทอื่น ๆ เช่นสื่อ (mp3), ไฟล์ปฏิบัติการ (exe), รูปภาพ (jpg) เป็นต้นเราจำเป็นต้องเพิ่มคำนำหน้า 'b' ในโหมดอ่าน / เขียน

คำสั่งต่อไปนี้จะแปลงสตริงเป็นไบต์และเขียนลงในไฟล์

f=open('test.bin', 'wb')
data=b"Hello World"
f.write(data)
f.close()

การแปลงสตริงข้อความเป็นไบต์สามารถทำได้โดยใช้ฟังก์ชัน encode ()

data="Hello World".encode('utf-8')

เราจำเป็นต้องใช้ ‘rb’โหมดอ่านไฟล์ไบนารี ค่าที่ส่งคืนของวิธี read () จะถูกถอดรหัสก่อนพิมพ์ก่อน

f=open('test.bin', 'rb')
data=f.read()
print (data.decode(encoding='utf-8'))

ในการเขียนข้อมูลจำนวนเต็มในไฟล์ไบนารีอ็อบเจ็กต์จำนวนเต็มควรถูกแปลงเป็นไบต์โดย to_bytes() วิธี.

n=25
n.to_bytes(8,'big')
f=open('test.bin', 'wb')
data=n.to_bytes(8,'big')
f.write(data)

หากต้องการอ่านกลับจากไฟล์ไบนารีให้แปลงเอาต์พุตของฟังก์ชัน read () เป็นจำนวนเต็มโดยฟังก์ชัน from_bytes ()

f=open('test.bin', 'rb')
data=f.read()
n=int.from_bytes(data, 'big')
print (n)

สำหรับข้อมูลทศนิยมเราจำเป็นต้องใช้ struct โมดูลจากไลบรารีมาตรฐานของ Python

import struct
x=23.50
data=struct.pack('f',x)
f=open('test.bin', 'wb')
f.write(data)

การคลายสตริงจากฟังก์ชัน read () เพื่อดึงข้อมูลลอยจากไฟล์ไบนารี

f=open('test.bin', 'rb')
data=f.read()
x=struct.unpack('f', data)
print (x)

อ่าน / เขียนพร้อมกัน

เมื่อเปิดไฟล์เพื่อเขียน (ด้วย 'w' หรือ 'a') จะไม่สามารถอ่านจากไฟล์ได้และในทางกลับกัน เพื่อแสดงข้อผิดพลาด UnSupportedOperation เราจำเป็นต้องปิดไฟล์ก่อนที่จะดำเนินการอื่น ๆ

ในการดำเนินการทั้งสองอย่างพร้อมกันเราต้องเพิ่มอักขระ '+' ในพารามิเตอร์โหมด ดังนั้นโหมด 'w +' หรือ 'r +' จึงเปิดใช้งานโดยใช้เมธอด write () เช่นเดียวกับ read () โดยไม่ต้องปิดไฟล์ อ็อบเจ็กต์ไฟล์ยังรองรับฟังก์ชันการค้นหา () เพื่อย้อนกลับสตรีมไปยังตำแหน่งไบต์ที่ต้องการ

f=open('test.txt','w+')
f.write('Hello world')
f.seek(0,0)
data=f.read()
print (data)
f.close()

ตารางต่อไปนี้สรุปวิธีการทั้งหมดที่มีให้กับไฟล์เช่น object

ซีเนียร์ No วิธีการและคำอธิบาย
1

close()

ปิดไฟล์ ไม่สามารถอ่านหรือเขียนไฟล์ที่ปิดได้อีกต่อไป

2

flush()

ล้างบัฟเฟอร์ภายใน

3

fileno()

ส่งคืนตัวอธิบายไฟล์จำนวนเต็ม

4

next()

ส่งกลับบรรทัดถัดไปจากไฟล์ทุกครั้งที่ถูกเรียก ใช้ next () iterator ใน Python 3

5

read([size])

อ่านขนาดไบต์ส่วนใหญ่จากไฟล์ (น้อยกว่าหากการอ่านพบ EOF ก่อนที่จะได้รับขนาดไบต์)

6

readline([size])

อ่านหนึ่งบรรทัดทั้งหมดจากไฟล์ อักขระขึ้นบรรทัดต่อท้ายจะถูกเก็บไว้ในสตริง

7

readlines([sizehint])

อ่านจนถึง EOF โดยใช้ readline () และส่งคืนรายการที่มีบรรทัด

8

seek(offset[, whence])

ตั้งค่าตำแหน่งปัจจุบันของไฟล์ 0- เริ่มต้น 1- ปัจจุบัน 2 ปลาย

9

seek(offset[, whence])

ตั้งค่าตำแหน่งปัจจุบันของไฟล์ 0- เริ่มต้น 1- ปัจจุบัน 2 ปลาย

10

tell()

ส่งคืนตำแหน่งปัจจุบันของไฟล์

11

truncate([size])

ตัดทอนขนาดของไฟล์

12

write(str)

เขียนสตริงลงในไฟล์ ไม่มีค่าส่งกลับ

นอกจากไฟล์อ็อบเจ็กต์ที่ส่งคืนโดย open()นอกจากนี้ยังสามารถดำเนินการไฟล์ IO โดยใช้ไลบรารีในตัวของ Python มีโมดูลระบบปฏิบัติการที่ให้ฟังก์ชันที่ขึ้นอยู่กับระบบปฏิบัติการที่เป็นประโยชน์ ฟังก์ชันเหล่านี้ดำเนินการอ่าน / เขียนในไฟล์ระดับต่ำ

open()ฟังก์ชันจากโมดูลระบบปฏิบัติการจะคล้ายกับ open () ในตัว อย่างไรก็ตามจะไม่ส่งคืนอ็อบเจ็กต์ไฟล์ แต่เป็นตัวบอกไฟล์ซึ่งเป็นจำนวนเต็มเฉพาะที่เกี่ยวข้องกับไฟล์ที่เปิด ค่าของ File descriptor 0, 1 และ 2 แสดงถึงสตรีม stdin, stdout และ stderr ไฟล์อื่น ๆ จะได้รับตัวอธิบายไฟล์ที่เพิ่มขึ้นตั้งแต่ 2 เป็นต้นไป

เช่นในกรณีของ open() ฟังก์ชันในตัว os.open()ยังต้องระบุโหมดการเข้าถึงไฟล์ ตารางต่อไปนี้แสดงโหมดต่างๆตามที่กำหนดไว้ในโมดูลระบบปฏิบัติการ

ซีเนียร์ โมดูลระบบปฏิบัติการและคำอธิบาย
1

os.O_RDONLY

เปิดให้อ่านเท่านั้น

2

os.O_WRONLY

เปิดให้เขียนเท่านั้น

3

os.O_RDWR

เปิดกว้างสำหรับการอ่านและการเขียน

4

os.O_NONBLOCK

อย่าปิดกั้นเมื่อเปิด

5

os.O_APPEND

ต่อท้ายการเขียนแต่ละครั้ง

6

os.O_CREAT

สร้างไฟล์หากไม่มีอยู่

7

os.O_TRUNC

ตัดขนาดเป็น 0

8

os.O_EXCL

เกิดข้อผิดพลาดหากมีการสร้างและไฟล์

หากต้องการเปิดไฟล์ใหม่สำหรับเขียนข้อมูลให้ระบุ O_WRONLY เช่นเดียวกับ O_CREATโหมดโดยการใส่ตัวดำเนินการไปป์ (|) ฟังก์ชัน os.open () ส่งคืนตัวบอกไฟล์

f=os.open("test.dat", os.O_WRONLY|os.O_CREAT)

โปรดทราบว่าข้อมูลถูกเขียนลงในไฟล์ดิสก์ในรูปแบบของสตริงไบต์ ดังนั้นสตริงปกติจะถูกแปลงเป็นสตริงไบต์โดยใช้ฟังก์ชัน encode () เหมือนก่อนหน้านี้

data="Hello World".encode('utf-8')

ฟังก์ชัน write () ในโมดูลระบบปฏิบัติการยอมรับสตริงไบต์และตัวอธิบายไฟล์

os.write(f,data)

อย่าลืมปิดไฟล์โดยใช้ฟังก์ชัน close ()

os.close(f)

หากต้องการอ่านเนื้อหาของไฟล์โดยใช้ฟังก์ชัน os.read () ให้ใช้คำสั่งต่อไปนี้:

f=os.open("test.dat", os.O_RDONLY)
data=os.read(f,20)
print (data.decode('utf-8'))

โปรดทราบว่าฟังก์ชัน os.read () ต้องการตัวอธิบายไฟล์และจำนวนไบต์ที่จะอ่าน (ความยาวของสตริงไบต์)

หากคุณต้องการเปิดไฟล์สำหรับการอ่าน / เขียนพร้อมกันให้ใช้โหมด O_RDWR ตารางต่อไปนี้แสดงฟังก์ชันที่เกี่ยวข้องกับการทำงานของไฟล์ที่สำคัญในโมดูลระบบปฏิบัติการ

ซีเนียร์ No ฟังก์ชั่นและคำอธิบาย
1

os.close(fd)

ปิด file descriptor

2

os.open(file, flags[, mode])

เปิดไฟล์และตั้งค่าแฟล็กต่างๆตามแฟล็กและอาจเป็นโหมดตามโหมด

3

os.read(fd, n)

อ่านไม่เกิน n ไบต์จาก file descriptor fd ส่งคืนสตริงที่มีไบต์อ่าน หากถึงจุดสิ้นสุดของไฟล์ที่อ้างถึงโดย fd สตริงว่างจะถูกส่งกลับ

4

os.write(fd, str)

เขียนสตริง str ไปยัง file descriptor fd ส่งคืนจำนวนไบต์ที่เขียนจริง

ออบเจ็กต์ไฟล์ในตัวของ Python ที่ส่งคืนโดยฟังก์ชัน open () ในตัวของ Python มีข้อบกพร่องที่สำคัญอย่างหนึ่ง เมื่อเปิดด้วยโหมด 'w' เมธอด write () จะยอมรับเฉพาะออบเจ็กต์สตริง

นั่นหมายความว่าหากคุณมีข้อมูลที่แสดงในรูปแบบที่ไม่ใช่สตริงออบเจ็กต์ของทั้งในคลาสในตัว (ตัวเลขพจนานุกรมรายการหรือทูเปิล) หรือคลาสอื่น ๆ ที่ผู้ใช้กำหนดเองจะไม่สามารถเขียนลงในไฟล์ได้โดยตรง ก่อนที่จะเขียนคุณต้องแปลงในการแสดงสตริง

numbers=[10,20,30,40]
   file=open('numbers.txt','w')
   file.write(str(numbers))
   file.close()

สำหรับไฟล์ไบนารีอาร์กิวเมนต์เป็น write()วิธีการต้องเป็นวัตถุไบต์ ตัวอย่างเช่นรายการจำนวนเต็มจะถูกแปลงเป็นไบต์โดยbytearray() จากนั้นเขียนลงในไฟล์

numbers=[10,20,30,40]
   data=bytearray(numbers)
   file.write(data)
   file.close()

ในการอ่านข้อมูลย้อนกลับจากไฟล์ในประเภทข้อมูลที่เกี่ยวข้องจำเป็นต้องทำการแปลงย้อนกลับ

file=open('numbers.txt','rb')
   data=file.read()
   print (list(data))

การแปลงด้วยตนเองประเภทนี้ของออบเจ็กต์เป็นรูปแบบสตริงหรือไบต์ (และในทางกลับกัน) เป็นเรื่องยุ่งยากและน่าเบื่อมาก เป็นไปได้ที่จะจัดเก็บสถานะของออบเจ็กต์ Python ในรูปแบบของไบต์สตรีมโดยตรงไปยังไฟล์หรือสตรีมหน่วยความจำและดึงกลับสู่สถานะดั้งเดิม กระบวนการนี้เรียกว่า serialization และ de-serialization

ไลบรารีในตัวของ Python มีโมดูลต่างๆสำหรับการทำให้เป็นอนุกรมและกระบวนการ deserialization

ซีเนียร์ ชื่อและคำอธิบาย
1

pickle

ไลบรารีอนุกรมเฉพาะของ Python

2

marshal

ไลบรารีที่ใช้ภายในสำหรับการทำให้เป็นอนุกรม

3

shelve

การคงอยู่ของวัตถุ Pythonic

4

dbm

ไลบรารีที่นำเสนอส่วนต่อประสานกับฐานข้อมูล Unix

5

csv

ไลบรารีสำหรับจัดเก็บและดึงข้อมูล Python เป็นรูปแบบ CSV

6

json

ไลบรารีสำหรับการทำให้เป็นอนุกรมเป็นรูปแบบ JSON สากล

คำศัพท์ของ Python สำหรับการทำให้เป็นอนุกรมและ deserialization คือการดองและไม่ลอกตามลำดับ โมดูลดองในไลบรารี Python ใช้รูปแบบข้อมูลเฉพาะของ Python ดังนั้นแอปพลิเคชันที่ไม่ใช่ Python อาจไม่สามารถแยกข้อมูลที่ถูกดองออกได้อย่างถูกต้อง นอกจากนี้ยังไม่แนะนำให้ยกเลิกการดึงข้อมูลจากแหล่งที่ไม่ได้รับการรับรองความถูกต้อง

ข้อมูลซีเรียลไลซ์ (ดอง) สามารถจัดเก็บในสตริงไบต์หรือไฟล์ไบนารี โมดูลนี้กำหนดdumps() และ loads()ฟังก์ชั่นในการดองและยกเลิกการเลือกข้อมูลโดยใช้สตริงไบต์ สำหรับกระบวนการตามไฟล์โมดูลมีdump() และ load() ฟังก์ชัน

โปรโตคอลดองของ Python เป็นแบบแผนที่ใช้ในการสร้างและแยกโครงสร้างวัตถุ Python ไปยัง / จากข้อมูลไบนารี ปัจจุบันโมดูลดองกำหนดโปรโตคอลที่แตกต่างกัน 5 แบบตามรายการด้านล่าง -

ซีเนียร์ ชื่อและคำอธิบาย
1

Protocol version 0

โปรโตคอลดั้งเดิม“ มนุษย์อ่านได้” ซึ่งเข้ากันได้กับเวอร์ชันก่อนหน้า

2

Protocol version 1

รูปแบบไบนารีเก่ายังเข้ากันได้กับ Python เวอร์ชันก่อนหน้า

3

Protocol version 2

แนะนำใน Python 2.3 ให้การดองคลาสสไตล์ใหม่อย่างมีประสิทธิภาพ

4

Protocol version 3

เพิ่มใน Python 3.0 แนะนำเมื่อต้องการความเข้ากันได้กับ Python 3 เวอร์ชันอื่น ๆ

5

Protocol version 4

ถูกเพิ่มใน Python 3.4 เพิ่มการรองรับสำหรับวัตถุขนาดใหญ่มาก

ตัวอย่าง

โมดูลการดองประกอบด้วยฟังก์ชัน dumps () ที่ส่งกลับการแสดงสตริงของข้อมูลดอง

from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)

เอาต์พุต

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.

ตัวอย่าง

ใช้ฟังก์ชัน load () เพื่อคลายสตริงและรับวัตถุพจนานุกรมต้นฉบับ

from pickle import load
dct=loads(dctstring)
print (dct)

เอาต์พุต

{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

นอกจากนี้ยังสามารถเก็บวัตถุดองไว้ในไฟล์ดิสก์โดยใช้ฟังก์ชัน dump () และดึงข้อมูลโดยใช้ฟังก์ชัน 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()

โมดูลดองยังมี API เชิงวัตถุสำหรับกลไกการทำให้เป็นอนุกรมในรูปแบบของ Pickler และ Unpickler ชั้นเรียน

ดังที่ได้กล่าวไว้ข้างต้นเช่นเดียวกับออบเจ็กต์ในตัวใน Python อ็อบเจ็กต์ของคลาสที่ผู้ใช้กำหนดเองสามารถต่ออนุกรมในไฟล์ดิสก์ได้อย่างต่อเนื่อง ในโปรแกรมต่อไปนี้เรากำหนดคลาสผู้ใช้ที่มีชื่อและหมายเลขโทรศัพท์เป็นแอตทริบิวต์อินสแตนซ์ นอกจากตัวสร้าง __init __ () คลาสจะแทนที่เมธอด __str __ () ที่ส่งคืนการแสดงสตริงของอ็อบเจ็กต์

class User:
   def __init__(self,name, mob):
      self.name=name
      self.mobile=mob
   def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))

ในการดองวัตถุของคลาสด้านบนในไฟล์เราใช้คลาส pickler และวิธีการ 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()

ในทางกลับกันคลาส Unpickler มีวิธี load () เพื่อดึงอ็อบเจ็กต์ที่ต่อเนื่องกันดังนี้ -

from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)

คุณสมบัติการทำให้เป็นอนุกรมอ็อบเจ็กต์ของโมดูลมาร์แชลในไลบรารีมาตรฐานของ Python นั้นคล้ายกับโมดูลดอง อย่างไรก็ตามโมดูลนี้ไม่ได้ใช้สำหรับข้อมูลวัตถุประสงค์ทั่วไป ในทางกลับกันมันถูกใช้โดย Python เองสำหรับการทำให้เป็นอนุกรมวัตถุภายในของ Python เพื่อรองรับการอ่าน / เขียนบนโมดูล Python เวอร์ชันคอมไพล์ (ไฟล์. pyc)

รูปแบบข้อมูลที่ใช้โดยโมดูล marshal เข้ากันไม่ได้กับเวอร์ชัน Python ดังนั้นสคริปต์ Python ที่คอมไพล์แล้ว (ไฟล์. pyc) ของเวอร์ชันหนึ่งส่วนใหญ่อาจไม่ดำเนินการกับอีกเวอร์ชันหนึ่ง

เช่นเดียวกับโมดูล pickle โมดูล marshal ยังกำหนดฟังก์ชัน load () และ dump () สำหรับการอ่านและเขียนอ็อบเจ็กต์ marshalled จาก / ไปยังไฟล์

ถ่ายโอนข้อมูล ()

ฟังก์ชันนี้เขียนการแทนค่าไบต์ของวัตถุ Python ที่รองรับไปยังไฟล์ ไฟล์นั้นเป็นไฟล์ไบนารีที่มีสิทธิ์ในการเขียน

โหลด ()

ฟังก์ชันนี้อ่านข้อมูลไบต์จากไฟล์ไบนารีและแปลงเป็นวัตถุ Python

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้ฟังก์ชัน dump () และ load () เพื่อจัดการกับออบเจ็กต์โค้ดของ Python ซึ่งใช้เพื่อเก็บโมดูล Python ที่คอมไพล์ไว้ล่วงหน้า

รหัสใช้ในตัว compile() ฟังก์ชันสร้างอ็อบเจกต์โค้ดจากสตริงต้นทางซึ่งฝังคำสั่ง Python

compile(source, file, mode)

พารามิเตอร์ไฟล์ควรเป็นไฟล์ที่ใช้อ่านโค้ด หากไม่ได้อ่านจากไฟล์ให้ส่งสตริงใด ๆ โดยพลการ

พารามิเตอร์โหมดคือ 'exec' หากแหล่งที่มามีลำดับของคำสั่ง 'eval' ถ้ามีนิพจน์เดียวหรือ 'single' หากมีคำสั่งโต้ตอบเดียว

จากนั้นอ็อบเจ็กต์โค้ดคอมไพล์จะถูกเก็บไว้ในไฟล์. pyc โดยใช้ฟังก์ชัน 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()

ในการลบซีเรียลอ็อบเจ็กต์จากไฟล์. pyc ใช้ฟังก์ชัน load () เนื่องจากจะส่งคืนวัตถุรหัสจึงสามารถเรียกใช้โดยใช้ exec () ซึ่งเป็นฟังก์ชันในตัวอื่น

import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)

โมดูลชั้นวางในไลบรารีมาตรฐานของ Python มีกลไกการคงอยู่ของวัตถุที่เรียบง่าย แต่มีประสิทธิภาพ ออบเจ็กต์ชั้นวางที่กำหนดไว้ในโมดูลนี้เป็นอ็อบเจ็กต์ที่เหมือนพจนานุกรมซึ่งถูกเก็บไว้อย่างต่อเนื่องในไฟล์ดิสก์ สิ่งนี้จะสร้างไฟล์ที่คล้ายกับฐานข้อมูล dbm บน UNIX เหมือนกับระบบ

พจนานุกรมชั้นวางมีข้อ จำกัด บางประการ เฉพาะประเภทข้อมูลสตริงเท่านั้นที่สามารถใช้เป็นคีย์ในอ็อบเจ็กต์พจนานุกรมพิเศษนี้ได้ในขณะที่อ็อบเจ็กต์ Python ที่สามารถเลือกได้สามารถใช้เป็นค่าได้

โมดูลชั้นวางกำหนดสามคลาสดังนี้ -

ซีเนียร์ No โมดูลและคำอธิบายของ Shelve
1

Shelf

นี่คือคลาสพื้นฐานสำหรับการติดตั้งชั้นวาง มันเริ่มต้นด้วยวัตถุเหมือนคำสั่ง

2

BsdDbShelf

นี่คือคลาสย่อยของคลาส Shelf วัตถุ dict ที่ส่งผ่านไปยังตัวสร้างต้องรองรับเมธอด first (), next (), previous (), last () และ set_location ()

3

DbfilenameShelf

นอกจากนี้ยังเป็นคลาสย่อยของ Shelf แต่ยอมรับชื่อไฟล์เป็นพารามิเตอร์ของตัวสร้างแทนที่จะเป็นวัตถุ dict

ฟังก์ชัน open () ที่กำหนดไว้ในโมดูลชั้นวางซึ่งส่งคืน a DbfilenameShelf วัตถุ.

open(filename, flag='c', protocol=None, writeback=False)

พารามิเตอร์ filename ถูกกำหนดให้กับฐานข้อมูลที่สร้างขึ้น ค่าดีฟอลต์สำหรับพารามิเตอร์แฟล็กคือ 'c' สำหรับการเข้าถึงแบบอ่าน / เขียน แฟล็กอื่น ๆ คือ 'w' (เขียนเท่านั้น) 'r' (อ่านอย่างเดียว) และ 'n' (ใหม่พร้อมการอ่าน / เขียน)

การทำให้เป็นอนุกรมถูกควบคุมโดยโปรโตคอลดองค่าเริ่มต้นคือไม่มี พารามิเตอร์การเขียนกลับพารามิเตอร์สุดท้ายโดยค่าเริ่มต้นคือเท็จ หากตั้งค่าเป็นจริงรายการที่เข้าถึงจะถูกแคช การเข้าถึงทุกครั้งจะเรียกใช้การดำเนินการ sync () และ close () ดังนั้นกระบวนการอาจช้า

รหัสต่อไปนี้จะสร้างฐานข้อมูลและจัดเก็บรายการพจนานุกรมไว้ในนั้น

import shelve
s=shelve.open("test")
s['name']="Ajay"
s['age']=23
s['marks']=75
s.close()

สิ่งนี้จะสร้างไฟล์ test.dir ในไดเร็กทอรีปัจจุบันและจัดเก็บข้อมูลคีย์ - ค่าในรูปแบบแฮช วัตถุชั้นวางมีวิธีการดังต่อไปนี้ -

ซีเนียร์ วิธีการและคำอธิบาย
1

close()

ซิงโครไนซ์และปิดวัตถุเขียนแบบถาวร

2

sync()

เขียนรายการทั้งหมดในแคชหากเปิดชั้นวางโดยตั้งค่าการเขียนกลับเป็น True

3

get()

ส่งคืนค่าที่เกี่ยวข้องกับคีย์

4

items()

รายการทูเปิล - ทูเปิลแต่ละคู่คือคู่ค่าคีย์

5

keys()

รายการคีย์ชั้นวาง

6

pop()

ลบคีย์ที่ระบุและส่งคืนค่าที่เกี่ยวข้อง

7

update()

อัปเดตชั้นวางจากคำสั่งอื่น / ทำซ้ำได้

8

values()

รายการค่าชั้นวาง

เพื่อเข้าถึงมูลค่าของคีย์เฉพาะในชั้นวาง -

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

เช่นเดียวกับในอ็อบเจ็กต์พจนานุกรมในตัวเมธอด items (), keys () และ values ​​() จะส่งคืนอ็อบเจ็กต์มุมมอง

print (list(s.items()))
[('name', 'Ajay'), ('age', 25), ('marks', 75)]  

print (list(s.keys()))
['name', 'age', 'marks']

print (list(s.values()))
['Ajay', 25, 75]

หากต้องการรวมรายการของพจนานุกรมอื่นเข้ากับชั้นวางให้ใช้วิธีการอัปเดต ()

d={'salary':10000, 'designation':'manager'}
s.update(d)
print (list(s.items()))

[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]

แพ็กเกจ dbm นำเสนอพจนานุกรมเช่นฐานข้อมูลสไตล์ DBM ของอินเตอร์เฟส DBM stands for DataBase Manager. สิ่งนี้ถูกใช้โดยระบบปฏิบัติการ UNIX (และ UNIX like) ไลบรารี dbbm เป็นเครื่องมือฐานข้อมูลอย่างง่ายที่เขียนโดย Ken Thompson ฐานข้อมูลเหล่านี้ใช้อ็อบเจ็กต์สตริงที่เข้ารหัสไบนารีเป็นคีย์เช่นเดียวกับค่า

ฐานข้อมูลจัดเก็บข้อมูลโดยใช้คีย์เดียว (คีย์หลัก) ในที่เก็บข้อมูลขนาดคงที่และใช้เทคนิคการแฮชเพื่อให้สามารถดึงข้อมูลได้อย่างรวดเร็วด้วยคีย์

แพ็คเกจ dbm ประกอบด้วยโมดูลต่อไปนี้ -

  • dbm.gnu โมดูลคืออินเทอร์เฟซสำหรับเวอร์ชันไลบรารี DBM ที่ใช้งานโดยโครงการ GNU

  • dbm.ndbm โมดูลมีอินเทอร์เฟซสำหรับการใช้งาน UNIX nbdm

  • dbm.dumbใช้เป็นตัวเลือกสำรองในเหตุการณ์ไม่พบการใช้งาน dbm อื่น ๆ สิ่งนี้ไม่ต้องการการอ้างอิงภายนอก แต่ช้ากว่าที่อื่น

>>> 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()

ฟังก์ชัน open () อนุญาตให้ใช้โหมดแฟล็กเหล่านี้ -

ซีเนียร์ คุณค่าและความหมาย
1

'r'

เปิดฐานข้อมูลที่มีอยู่สำหรับการอ่านเท่านั้น (ค่าเริ่มต้น)

2

'w'

เปิดฐานข้อมูลที่มีอยู่สำหรับการอ่านและเขียน

3

'c'

เปิดฐานข้อมูลสำหรับการอ่านและเขียนสร้างขึ้นหากไม่มีอยู่

4

'n'

สร้างฐานข้อมูลใหม่ที่ว่างเปล่าเสมอเปิดสำหรับการอ่านและเขียน

วัตถุ dbm เป็นเหมือนพจนานุกรมเช่นเดียวกับวัตถุชั้นวาง ดังนั้นการดำเนินการพจนานุกรมทั้งหมดสามารถทำได้ วัตถุ dbm สามารถเรียกใช้เมธอด get (), pop (), append () และ update () โค้ดต่อไปนี้จะเปิด 'mydbm.db' พร้อมกับแฟล็ก 'r' และวนซ้ำคอลเลกชันของคู่คีย์ - ค่า

>>> 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. รูปแบบไฟล์นี้เป็นรูปแบบข้อมูลที่ใช้กันทั่วไปในขณะที่ส่งออก / นำเข้าข้อมูลไปยัง / จากสเปรดชีตและตารางข้อมูลในฐานข้อมูล โมดูล csv ถูกรวมไว้ในไลบรารีมาตรฐานของ Python อันเป็นผลมาจาก PEP 305 โดยนำเสนอคลาสและวิธีการดำเนินการอ่าน / เขียนบนไฟล์ CSV ตามคำแนะนำของ PEP 305

CSV เป็นรูปแบบข้อมูลการส่งออกที่ต้องการโดยซอฟต์แวร์สเปรดชีต Excel ของ Microsoft อย่างไรก็ตามโมดูล csv สามารถจัดการข้อมูลที่แสดงโดยภาษาถิ่นอื่นได้เช่นกัน

อินเทอร์เฟซ CSV API ประกอบด้วยคลาสนักเขียนและผู้อ่านต่อไปนี้ -

นักเขียน ()

ฟังก์ชันนี้ในโมดูล csv ส่งคืนอ็อบเจ็กต์ตัวเขียนที่แปลงข้อมูลเป็นสตริงที่คั่นและเก็บในอ็อบเจ็กต์ไฟล์ ฟังก์ชันต้องการอ็อบเจ็กต์ไฟล์ที่มีสิทธิ์ในการเขียนเป็นพารามิเตอร์ ทุกแถวที่เขียนในไฟล์จะออกอักขระขึ้นบรรทัดใหม่ เพื่อป้องกันไม่ให้มีช่องว่างเพิ่มเติมระหว่างบรรทัดพารามิเตอร์ขึ้นบรรทัดใหม่ถูกตั้งค่าเป็น ""

คลาสนักเขียนมีวิธีการดังต่อไปนี้ -

ช่างเขียน ()

วิธีนี้เขียนรายการในรูปแบบที่ทำซ้ำได้ (list, tuple หรือ string) โดยคั่นด้วยอักขระลูกน้ำ

นักเขียน ()

เมธอดนี้รับรายการของการวนซ้ำเป็นพารามิเตอร์และเขียนแต่ละรายการเป็นบรรทัดรายการที่คั่นด้วยจุลภาคในไฟล์

Example

ตัวอย่างต่อไปนี้แสดงการใช้ฟังก์ชัน writer () ขั้นแรกให้เปิดไฟล์ในโหมด 'w' ไฟล์นี้ใช้เพื่อรับวัตถุตัวเขียน จากนั้นทูเพิลแต่ละรายการในรายการทูเปิลจะถูกเขียนไปยังไฟล์โดยใช้เมธอด 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

สิ่งนี้จะสร้างไฟล์ 'persons.csv' ในไดเรกทอรีปัจจุบัน จะแสดงข้อมูลต่อไปนี้

Lata,22,45
Anil,21,56
John,20,60

แทนที่จะวนซ้ำรายการเพื่อเขียนทีละแถวเราสามารถใช้วิธีการเขียน ()

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()

ผู้อ่าน ()

ฟังก์ชันนี้ส่งคืนอ็อบเจ็กต์ผู้อ่านซึ่งส่งคืนตัววนซ้ำของบรรทัดในไฟล์ csv file. การใช้ Regular for loop ทุกบรรทัดในไฟล์จะแสดงในตัวอย่างต่อไปนี้ -

ตัวอย่าง

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   for row in obj:
      print (row)

เอาต์พุต

['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

อ็อบเจ็กต์ผู้อ่านเป็นตัววนซ้ำ ดังนั้นจึงสนับสนุนฟังก์ชัน next () ซึ่งสามารถใช้เพื่อแสดงทุกบรรทัดในไฟล์ csv แทนไฟล์for loop.

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   while True:
   try:
      row=next(obj)
      print (row)
   except StopIteration:
      break

ดังที่ได้กล่าวไว้ก่อนหน้านี้โมดูล csv ใช้ Excel เป็นภาษาถิ่นเริ่มต้น โมดูล csv ยังกำหนดคลาสภาษาถิ่น ภาษาถิ่นคือชุดของมาตรฐานที่ใช้ในการใช้โปรโตคอล CSV รายการภาษาถิ่นสามารถรับได้จากฟังก์ชัน list_dialects ()

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

นอกจาก iterables แล้วโมดูล csv ยังสามารถเอ็กซ์พอร์ตอ็อบเจกต์พจนานุกรมไปยังไฟล์ CSV และอ่านเพื่อเติมอ็อบเจ็กต์พจนานุกรม Python เพื่อจุดประสงค์นี้โมดูลนี้กำหนดคลาสต่อไปนี้ -

DictWriter ()

ฟังก์ชันนี้ส่งคืนวัตถุ DictWriter คล้ายกับวัตถุตัวเขียน แต่แถวจะถูกจับคู่กับวัตถุพจนานุกรม ฟังก์ชันต้องการอ็อบเจ็กต์ไฟล์ที่มีสิทธิ์ในการเขียนและรายการคีย์ที่ใช้ในพจนานุกรมเป็นพารามิเตอร์ชื่อฟิลด์ ใช้เพื่อเขียนบรรทัดแรกในไฟล์เป็นส่วนหัว

ส่วนหัวเขียน ()

วิธีนี้เขียนรายการคีย์ในพจนานุกรมเป็นบรรทัดที่คั่นด้วยจุลภาคเป็นบรรทัดแรกในไฟล์

ในตัวอย่างต่อไปนี้มีการกำหนดรายการพจนานุกรม แต่ละรายการในรายการคือพจนานุกรม โดยใช้วิธีการเขียน () จะเขียนลงในไฟล์ในลักษณะที่คั่นด้วยลูกน้ำ

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()

ไฟล์ persons.csv แสดงเนื้อหาต่อไปนี้ -

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader ()

ฟังก์ชันนี้ส่งคืนอ็อบเจ็กต์ DictReader จากไฟล์ CSV ที่อยู่ภายใต้ ในกรณีของอ็อบเจ็กต์ตัวอ่านอ็อบเจ็กต์นี้ยังเป็นตัววนซ้ำโดยใช้เนื้อหาของไฟล์ที่ดึงมา

csvfile=open('persons.csv','r', newline='')
obj=csv.DictReader(csvfile)

คลาสนี้มีแอตทริบิวต์ชื่อฟิลด์โดยส่งคืนคีย์พจนานุกรมที่ใช้เป็นส่วนหัวของไฟล์

print (obj.fieldnames)
['name', 'age', 'marks']

ใช้การวนซ้ำบนวัตถุ DictReader เพื่อดึงวัตถุพจนานุกรมแต่ละรายการ

for row in obj:
   print (row)

ส่งผลให้เกิดผลลัพธ์ต่อไปนี้ -

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

ในการแปลงวัตถุ OrderDict เป็นพจนานุกรมปกติเราต้องนำเข้า OrderDict จากโมดูลคอลเลกชันก่อน

from collections import OrderedDict
   r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
   dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}

JSON ย่อมาจาก JavaScript Object Notation. เป็นรูปแบบการแลกเปลี่ยนข้อมูลที่มีน้ำหนักเบา เป็นรูปแบบข้อความที่ไม่ขึ้นกับภาษาและข้ามแพลตฟอร์มรองรับภาษาโปรแกรมหลายภาษา รูปแบบนี้ใช้สำหรับการแลกเปลี่ยนข้อมูลระหว่างเว็บเซิร์ฟเวอร์และไคลเอนต์

รูปแบบ JSON คล้ายกับผักดอง อย่างไรก็ตามการทำให้เป็นอนุกรมของดองเป็นแบบเฉพาะของ Python ในขณะที่รูปแบบ JSON ถูกนำไปใช้ในหลายภาษาจึงกลายเป็นมาตรฐานสากล ฟังก์ชันและส่วนต่อประสานของโมดูล json ในไลบรารีมาตรฐานของ Python นั้นคล้ายกับโมดูลดองและมาร์แชล

เช่นเดียวกับในโมดูลดองโมดูล json ก็มีให้เช่นกัน dumps() และ loads() ฟังก์ชันสำหรับการทำให้เป็นอนุกรมของวัตถุ Python เป็นสตริงที่เข้ารหัส JSON และ dump() และ load() ฟังก์ชันเขียนและอ่านอ็อบเจกต์ Python แบบอนุกรมไปยัง / จากไฟล์

  • dumps() - ฟังก์ชันนี้จะแปลงวัตถุเป็นรูปแบบ JSON

  • loads() - ฟังก์ชันนี้จะแปลงสตริง JSON กลับเป็น Python object

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้งานพื้นฐานของฟังก์ชันเหล่านี้ -

import json
   data=['Rakesh',{'marks':(50,60,70)}]
   s=json.dumps(data)
json.loads(s)

ฟังก์ชัน dumps () สามารถใช้อาร์กิวเมนต์ sort_keys ที่เป็นทางเลือก โดยค่าเริ่มต้นจะเป็นเท็จ หากตั้งค่าเป็น True คีย์พจนานุกรมจะปรากฏตามลำดับที่จัดเรียงในสตริง JSON

ฟังก์ชัน dumps () มีพารามิเตอร์ทางเลือกอื่นที่เรียกว่าการเยื้องซึ่งใช้ตัวเลขเป็นค่า กำหนดความยาวของแต่ละส่วนของการจัดรูปแบบของสตริง json ซึ่งคล้ายกับเอาต์พุตการพิมพ์

โมดูล json ยังมี API เชิงวัตถุที่สอดคล้องกับฟังก์ชันข้างต้น มีสองคลาสที่กำหนดไว้ในโมดูล - JSONEncoder และ JSONDecoder

คลาส JSONEncoder

ออบเจ็กต์ของคลาสนี้คือตัวเข้ารหัสสำหรับโครงสร้างข้อมูล Python ข้อมูล Python แต่ละประเภทจะถูกแปลงเป็นประเภท JSON ที่สอดคล้องกันดังแสดงในตารางต่อไปนี้ -

Python JSON
Dict วัตถุ
รายการทูเพิล อาร์เรย์
Str สตริง
int, float, int- และลอยได้มา Enums จำนวน
จริง จริง
เท็จ เท็จ
ไม่มี โมฆะ

คลาส JSONEncoder ถูกสร้างอินสแตนซ์โดยตัวสร้าง JSONEncoder () วิธีการที่สำคัญต่อไปนี้ถูกกำหนดไว้ในคลาสตัวเข้ารหัส -

ซีเนียร์ วิธีการและคำอธิบาย
1

encode()

ทำให้ออบเจ็กต์ Python เป็นอนุกรมในรูปแบบ JSON

2

iterencode()

เข้ารหัสอ็อบเจ็กต์และส่งคืนตัวทำซ้ำที่ให้รูปแบบการเข้ารหัสของแต่ละไอเท็มในอ็อบเจ็กต์

3

indent

กำหนดระดับการเยื้องของสตริงที่เข้ารหัส

4

sort_keys

เป็นจริงหรือเท็จเพื่อให้คีย์ปรากฏตามลำดับที่เรียงหรือไม่

5

Check_circular

ถ้าเป็นจริงให้ตรวจสอบการอ้างอิงแบบวงกลมในออบเจ็กต์ประเภทคอนเทนเนอร์

ตัวอย่างต่อไปนี้เข้ารหัสวัตถุรายการ Python

e=json.JSONEncoder()
e.encode(data)

คลาส JSONDecoder

ออบเจ็กต์ของคลาสนี้ช่วยในการถอดรหัสในสตริง json กลับไปที่โครงสร้างข้อมูล Python เมธอดหลักในคลาสนี้คือถอดรหัส () โค้ดตัวอย่างต่อไปนี้ดึงข้อมูลรายการ Python จากสตริงที่เข้ารหัสในขั้นตอนก่อนหน้า

d=json.JSONDecoder()
d.decode(s)

โมดูล json กำหนด load() และ dump() ฟังก์ชันในการเขียนข้อมูล JSON ไปยังไฟล์เช่นอ็อบเจ็กต์ซึ่งอาจเป็นไฟล์ดิสก์หรือไบต์สตรีมและอ่านข้อมูลกลับจากไฟล์เหล่านี้

ถ่ายโอนข้อมูล ()

ฟังก์ชันนี้เขียนข้อมูลวัตถุ JSONed Python ไปยังไฟล์ ต้องเปิดไฟล์ด้วยโหมด 'w'

import json
data=['Rakesh', {'marks': (50, 60, 70)}]
   fp=open('json.txt','w')
   json.dump(data,fp)
   fp.close()

รหัสนี้จะสร้าง 'json.txt' ในไดเรกทอรีปัจจุบัน แสดงเนื้อหาดังนี้ -

["Rakesh", {"marks": [50, 60, 70]}]

โหลด ()

ฟังก์ชันนี้จะโหลดข้อมูล JSON จากไฟล์และส่งคืนวัตถุ Python จากมัน ไฟล์ต้องเปิดโดยได้รับอนุญาตให้อ่าน (ควรมีโหมด 'r')

Example

fp=open('json.txt','r')
   ret=json.load(fp)
   print (ret)
   fp.close()

Output

['Rakesh', {'marks': [50, 60, 70]}]

json.tool โมดูลยังมีอินเทอร์เฟซบรรทัดคำสั่งที่ตรวจสอบความถูกต้องของข้อมูลในไฟล์และพิมพ์ออบเจ็กต์ JSON ในรูปแบบที่สวยงาม

C:\python37>python -m json.tool json.txt
[
   "Rakesh",   
   {
      "marks": [
         50,
         60,
         70
      ]
   }
]

XML เป็นคำย่อของ eXtensible Markup Language. เป็นภาษาแบบพกพาโอเพ่นซอร์สและข้ามแพลตฟอร์มเช่น HTML หรือ SGML และแนะนำโดย World Wide Web Consortium

เป็นรูปแบบการแลกเปลี่ยนข้อมูลที่รู้จักกันดีซึ่งใช้โดยแอปพลิเคชันจำนวนมากเช่นบริการเว็บเครื่องมือสำนักงานและ Service Oriented Architectures(SOA). รูปแบบ XML นั้นสามารถอ่านได้โดยเครื่องและมนุษย์สามารถอ่านได้

แพ็คเกจ xml ของไลบรารี Python มาตรฐานประกอบด้วยโมดูลต่อไปนี้สำหรับการประมวลผล XML -

ซีเนียร์ โมดูลและคำอธิบาย
1

xml.etree.ElementTree

ElementTree API ซึ่งเป็นโปรเซสเซอร์ XML ที่เรียบง่ายและมีน้ำหนักเบา

2

xml.dom

ข้อกำหนด DOM API

3

xml.dom.minidom

การใช้งาน DOM ขั้นต่ำ

4

xml.sax

การใช้งานอินเทอร์เฟซ SAX2

5

xml.parsers.expat

การรวมตัวแยกวิเคราะห์ Expat

ข้อมูลในเอกสาร XML ถูกจัดเรียงในรูปแบบลำดับชั้นแบบต้นไม้เริ่มต้นด้วยรูทและองค์ประกอบ แต่ละองค์ประกอบเป็นโหนดเดียวในทรีและมีแอตทริบิวต์อยู่ในแท็ก <> และ </> อาจมีการกำหนดองค์ประกอบย่อยอย่างน้อยหนึ่งรายการให้กับแต่ละองค์ประกอบ

ต่อไปนี้เป็นตัวอย่างทั่วไปของเอกสาร 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>

ขณะใช้งาน ElementTreeโมดูลขั้นตอนแรกคือการตั้งค่าองค์ประกอบรากของต้นไม้ แต่ละองค์ประกอบมีแท็กและแอตทริบิวต์ซึ่งเป็นออบเจ็กต์ dict สำหรับองค์ประกอบรากแอตทริบิวต์คือพจนานุกรมว่างเปล่า

import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')

ตอนนี้เราสามารถเพิ่มองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบภายใต้องค์ประกอบราก วัตถุแต่ละองค์ประกอบอาจมีSubElements. แต่ละองค์ประกอบย่อยมีคุณสมบัติและคุณสมบัติข้อความ

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'

องค์ประกอบใหม่นี้ต่อท้ายรูทโดยใช้วิธี append ()

root.append(student)

ต่อท้ายองค์ประกอบได้มากเท่าที่ต้องการโดยใช้วิธีการด้านบน ในที่สุดอ็อบเจ็กต์องค์ประกอบรูทจะถูกเขียนลงในไฟล์

tree = xmlobj.ElementTree(root)
   file = open('studentlist.xml','wb')
   tree.write(file)
   file.close()

ตอนนี้เรามาดูวิธีการแยกวิเคราะห์ไฟล์ XML สำหรับสิ่งนั้นให้สร้างแผนผังเอกสารโดยให้ชื่อเป็นพารามิเตอร์ไฟล์ในตัวสร้าง ElementTree

tree = xmlobj.ElementTree(file='studentlist.xml')

วัตถุต้นไม้มี getroot() วิธีการรับองค์ประกอบรูทและ getchildren () ส่งคืนรายการองค์ประกอบด้านล่าง

root = tree.getroot()
children = root.getchildren()

อ็อบเจ็กต์พจนานุกรมที่สอดคล้องกับแต่ละองค์ประกอบย่อยถูกสร้างขึ้นโดยการวนซ้ำคอลเลกชันองค์ประกอบย่อยของโหนดลูกแต่ละโหนด

for child in children:
   student={}
   pairs = child.getchildren()
   for pair in pairs:
      product[pair.tag]=pair.text

จากนั้นพจนานุกรมแต่ละรายการจะถูกผนวกเข้ากับรายการที่ส่งคืนรายการต้นฉบับของวัตถุพจนานุกรม

SAXเป็นอินเทอร์เฟซมาตรฐานสำหรับการแยกวิเคราะห์ XML ตามเหตุการณ์ การแยกวิเคราะห์ XML ด้วย SAX ต้องการ ContentHandler โดย subclassing xml.sax.ContentHandler คุณลงทะเบียนการโทรกลับสำหรับเหตุการณ์ที่น่าสนใจจากนั้นให้โปรแกรมแยกวิเคราะห์ดำเนินการผ่านเอกสาร

SAX มีประโยชน์เมื่อเอกสารของคุณมีขนาดใหญ่หรือคุณมีข้อ จำกัด ของหน่วยความจำเนื่องจากจะแยกวิเคราะห์ไฟล์เมื่ออ่านจากดิสก์ดังนั้นไฟล์ทั้งหมดจะไม่ถูกเก็บไว้ในหน่วยความจำ

Document Object Model

(DOM) API เป็นคำแนะนำของ World Wide Web Consortium ในกรณีนี้ไฟล์ทั้งหมดจะถูกอ่านลงในหน่วยความจำและจัดเก็บในรูปแบบลำดับชั้น (ตามต้นไม้) เพื่อแสดงคุณลักษณะทั้งหมดของเอกสาร XML

SAX ไม่เร็วเท่า DOM ที่มีไฟล์ขนาดใหญ่ ในทางกลับกัน DOM สามารถฆ่าทรัพยากรได้หากใช้กับไฟล์ขนาดเล็กจำนวนมาก SAX เป็นแบบอ่านอย่างเดียวในขณะที่ DOM อนุญาตให้เปลี่ยนแปลงไฟล์ XML

โดย MAC OS X จะใช้รูปแบบ plist เป็นหลักไฟล์เหล่านี้เป็นเอกสาร XML โดยทั่วไป พวกเขาจัดเก็บและดึงคุณสมบัติของวัตถุ ไลบรารี Python มีโมดูล plist ซึ่งใช้ในการอ่านและเขียนไฟล์ 'รายการคุณสมบัติ' (โดยปกติจะมีนามสกุล. plist ')

plistlib โมดูลมีความคล้ายคลึงกับไลบรารีการทำให้เป็นอนุกรมอื่น ๆ มากขึ้นหรือน้อยลงนอกจากนี้ยังมีฟังก์ชัน dumps () และโหลด () สำหรับการแสดงสตริงของวัตถุ Python และฟังก์ชัน load () และ dump () สำหรับการทำงานของดิสก์

วัตถุพจนานุกรมต่อไปนี้จะรักษาคุณสมบัติ (คีย์) และค่าที่สอดคล้องกัน -

proplist = {
   "name" : "Ganesh",
   "designation":"manager",
   "dept":"accts",
   "salary" : {"basic":12000, "da":4000, "hra":800}
}

ในการเขียนคุณสมบัติเหล่านี้ในไฟล์ดิสก์เราเรียกว่าฟังก์ชัน dump () ในโมดูล plist

import plistlib
fileName=open('salary.plist','wb')
plistlib.dump(proplist, fileName)
fileName.close()

ในทางกลับกันหากต้องการอ่านค่าคุณสมบัติย้อนกลับให้ใช้ฟังก์ชัน load () ดังนี้ -

fp= open('salary.plist', 'rb')
pl = plistlib.load(fp)
print(pl)

ข้อเสียที่สำคัญอย่างหนึ่งของไฟล์ CSV, JSON, XML และอื่น ๆ คือไฟล์เหล่านี้ไม่มีประโยชน์มากนักสำหรับการเข้าถึงแบบสุ่มและการประมวลผลธุรกรรมเนื่องจากโดยส่วนใหญ่ไม่มีโครงสร้าง ดังนั้นการแก้ไขเนื้อหาจึงเป็นเรื่องยากมาก

ไฟล์แบบแบนเหล่านี้ไม่เหมาะสำหรับสภาพแวดล้อมไคลเอนต์เซิร์ฟเวอร์เนื่องจากไม่มีความสามารถในการประมวลผลแบบอะซิงโครนัส การใช้ไฟล์ข้อมูลที่ไม่มีโครงสร้างจะนำไปสู่ความซ้ำซ้อนของข้อมูลและความไม่สอดคล้องกัน

ปัญหาเหล่านี้สามารถเอาชนะได้โดยใช้ฐานข้อมูลเชิงสัมพันธ์ ฐานข้อมูลคือการรวบรวมข้อมูลที่จัดระเบียบเพื่อลบความซ้ำซ้อนและความไม่สอดคล้องกันและรักษาความสมบูรณ์ของข้อมูล แบบจำลองฐานข้อมูลเชิงสัมพันธ์เป็นที่นิยมอย่างมาก

แนวคิดพื้นฐานคือการจัดเรียงข้อมูลในตารางเอนทิตี (เรียกว่าความสัมพันธ์) โครงสร้างตารางเอนทิตีมีหนึ่งแอตทริบิวต์ที่มีค่าไม่ซ้ำกันสำหรับแต่ละแถว แอตทริบิวต์ดังกล่าวเรียกว่า'primary key'.

เมื่อคีย์หลักของตารางหนึ่งปรากฏในโครงสร้างของตารางอื่นจะเรียกว่า 'Foreign key'และนี่เป็นพื้นฐานของความสัมพันธ์ระหว่างทั้งสอง จากรุ่นนี้ปัจจุบันมีผลิตภัณฑ์ RDBMS ยอดนิยมมากมาย -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

SQLite เป็นฐานข้อมูลเชิงสัมพันธ์ที่มีน้ำหนักเบาซึ่งใช้ในแอปพลิเคชันที่หลากหลาย มันเป็นเอ็นจิ้นฐานข้อมูล SQL แบบทรานแซคชันไม่มีเซิร์ฟเวอร์ไม่มีเซิร์ฟเวอร์ ฐานข้อมูลทั้งหมดเป็นไฟล์เดียวซึ่งสามารถวางไว้ที่ใดก็ได้ในระบบไฟล์ เป็นซอฟต์แวร์โอเพ่นซอร์สที่มีขนาดเล็กมากและไม่มีการกำหนดค่า เป็นที่นิยมใช้ในอุปกรณ์ฝังตัว IOT และแอพมือถือ

ฐานข้อมูลเชิงสัมพันธ์ทั้งหมดใช้ SQL สำหรับจัดการข้อมูลในตาราง อย่างไรก็ตามก่อนหน้านี้แต่ละฐานข้อมูลเหล่านี้เคยเชื่อมต่อกับแอปพลิเคชัน Python ด้วยความช่วยเหลือของโมดูล Python เฉพาะกับประเภทของฐานข้อมูล

ดังนั้นจึงขาดความเข้ากันได้ในหมู่พวกเขา หากผู้ใช้ต้องการเปลี่ยนเป็นผลิตภัณฑ์ฐานข้อมูลอื่นจะพิสูจน์ได้ยาก ปัญหาความไม่ลงรอยกันนี้ได้รับการแก้ไขโดยการเพิ่ม 'Python Enhancement Proposal (PEP 248)' เพื่อแนะนำอินเทอร์เฟซที่สอดคล้องกันกับฐานข้อมูลเชิงสัมพันธ์ที่เรียกว่า DB-API มีการเรียกคำแนะนำล่าสุดDB-APIเวอร์ชัน 2.0.2 (PEP 249)

ไลบรารีมาตรฐานของ Python ประกอบด้วยโมดูล sqlite3 ซึ่งเป็นโมดูลที่สอดคล้องกับ DB-API สำหรับจัดการฐานข้อมูล SQLite ผ่านโปรแกรม Python บทนี้อธิบายการเชื่อมต่อของ Python กับฐานข้อมูล SQLite

ดังที่ได้กล่าวไว้ก่อนหน้านี้ Python มีการรองรับฐานข้อมูล SQLite ในรูปแบบของโมดูล sqlite3 สำหรับฐานข้อมูลอื่นโมดูล Python ที่เข้ากันได้กับ DB-API จะต้องได้รับการติดตั้งด้วยความช่วยเหลือของยูทิลิตี้ pip ตัวอย่างเช่นในการใช้ฐานข้อมูล MySQL เราจำเป็นต้องติดตั้งโมดูล PyMySQL

pip install pymysql

แนะนำขั้นตอนต่อไปนี้ใน DB-API -

  • สร้างการเชื่อมต่อกับฐานข้อมูลโดยใช้ connect() ฟังก์ชั่นและรับวัตถุการเชื่อมต่อ

  • โทร cursor() วิธีการเชื่อมต่อวัตถุเพื่อรับวัตถุเคอร์เซอร์

  • สร้างสตริงแบบสอบถามที่ประกอบด้วยคำสั่ง SQL ที่จะดำเนินการ

  • ดำเนินการค้นหาที่ต้องการโดยเรียกใช้ execute() วิธี.

  • ปิดการเชื่อมต่อ

import sqlite3
db=sqlite3.connect('test.db')

ในที่นี้ db คือวัตถุเชื่อมต่อที่แสดงถึง test.db โปรดทราบว่าฐานข้อมูลนั้นจะถูกสร้างขึ้นหากยังไม่มีอยู่ db วัตถุการเชื่อมต่อมีวิธีการดังต่อไปนี้ -

ซีเนียร์ วิธีการและคำอธิบาย
1

cursor():

ส่งคืนวัตถุเคอร์เซอร์ที่ใช้การเชื่อมต่อนี้

2

commit():

กระทำธุรกรรมที่รอดำเนินการกับฐานข้อมูลอย่างชัดเจน

3

rollback():

วิธีทางเลือกนี้ทำให้ธุรกรรมถูกย้อนกลับไปที่จุดเริ่มต้น

4

close():

ปิดการเชื่อมต่อกับฐานข้อมูลอย่างถาวร

เคอร์เซอร์ทำหน้าที่เป็นตัวจัดการสำหรับคิวรี SQL ที่กำหนดซึ่งอนุญาตให้เรียกข้อมูลแถวหนึ่งหรือหลายแถวของผลลัพธ์ วัตถุเคอร์เซอร์ได้มาจากการเชื่อมต่อเพื่อดำเนินการสืบค้น SQL โดยใช้คำสั่งต่อไปนี้ -

cur=db.cursor()

วัตถุเคอร์เซอร์มีวิธีการกำหนดไว้ดังนี้ -

ซีเนียร์ No วิธีการและคำอธิบาย
1

execute()

เรียกใช้แบบสอบถาม SQL ในพารามิเตอร์สตริง

2

executemany()

เรียกใช้แบบสอบถาม SQL โดยใช้ชุดของพารามิเตอร์ในรายการสิ่งที่เพิ่มขึ้น

3

fetchone()

ดึงแถวถัดไปจากชุดผลลัพธ์การสืบค้น

4

fetchall()

ดึงแถวที่เหลือทั้งหมดจากชุดผลการค้นหา

5

callproc()

เรียกกระบวนงานที่เก็บไว้

6

close()

ปิดวัตถุเคอร์เซอร์

รหัสต่อไปนี้สร้างตารางใน 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()

ความสมบูรณ์ของข้อมูลที่ต้องการในฐานข้อมูลทำได้โดย commit() และ rollback()วิธีการของวัตถุการเชื่อมต่อ สตริงแบบสอบถาม SQL อาจมีแบบสอบถาม SQL ที่ไม่ถูกต้องซึ่งอาจทำให้เกิดข้อยกเว้นซึ่งควรได้รับการจัดการอย่างเหมาะสม ด้วยเหตุนี้คำสั่ง execute () จะถูกวางไว้ใน try block หากทำสำเร็จผลลัพธ์จะถูกบันทึกอย่างต่อเนื่องโดยใช้เมธอดกระทำ () หากการสืบค้นล้มเหลวธุรกรรมจะถูกยกเลิกโดยใช้เมธอด rollback ()

รหัสต่อไปนี้เรียกใช้แบบสอบถาม INSERT บนตารางนักเรียนใน 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()

หากคุณต้องการให้ข้อมูลในประโยคค่าของการสอบถาม INSERT โดยการป้อนข้อมูลของผู้ใช้แบบไดนามิกให้ใช้การแทนที่พารามิเตอร์ตามที่แนะนำใน Python DB-API เดอะ? อักขระถูกใช้เป็นตัวยึดตำแหน่งในสตริงคิวรีและให้ค่าในรูปแบบทูเพิลในเมธอด execute () ตัวอย่างต่อไปนี้แทรกเร็กคอร์ดโดยใช้วิธีการแทนที่พารามิเตอร์ ชื่ออายุและเครื่องหมายถูกนำมาเป็นข้อมูล

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()

โมดูล sqlite3 กำหนดไฟล์ executemany()วิธีการที่สามารถเพิ่มหลายระเบียนพร้อมกัน ข้อมูลที่จะเพิ่มควรระบุไว้ในรายการทูเพิลโดยทูเพิลแต่ละตัวจะมีเรกคอร์ดเดียว วัตถุรายการเป็นพารามิเตอร์ของวิธีการดำเนินการ () พร้อมกับสตริงแบบสอบถาม อย่างไรก็ตามวิธีการดำเนินการ () ไม่ได้รับการสนับสนุนโดยโมดูลอื่น ๆ บางส่วน

UPDATEโดยปกติคิวรีจะมีนิพจน์เชิงตรรกะที่ระบุโดยส่วนคำสั่ง WHERE สตริงเคียวรีในเมธอด execute () ควรมีไวยากรณ์เคียวรี UPDATE ในการอัปเดตค่าของ 'age' เป็น 23 สำหรับ name = 'Anil' ให้กำหนดสตริงดังต่อไปนี้:

qry="update student set age=23 where name='Anil';"

เพื่อให้กระบวนการอัพเดตเป็นแบบไดนามิกมากขึ้นเราใช้วิธีการแทนที่พารามิเตอร์ตามที่อธิบายไว้ข้างต้น

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()

ในทำนองเดียวกันการดำเนินการ DELETE จะดำเนินการโดยเรียกใช้เมธอด execute () ด้วยสตริงที่มีไวยากรณ์คำสั่ง DELETE ของ SQL อนึ่งDELETE แบบสอบถามมักจะมีไฟล์ WHERE อนุประโยค

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()

การดำเนินการที่สำคัญอย่างหนึ่งบนตารางฐานข้อมูลคือการดึงบันทึกจากตารางฐานข้อมูล SQL ให้SELECTสอบถามเพื่อวัตถุประสงค์ เมื่อสตริงที่มีไวยากรณ์คิวรี SELECT ถูกกำหนดให้กับเมธอด execute () อ็อบเจ็กต์ชุดผลลัพธ์จะถูกส่งกลับ มีสองวิธีที่สำคัญกับวัตถุเคอร์เซอร์โดยใช้หนึ่งหรือหลายระเบียนจากชุดผลลัพธ์ที่สามารถเรียกคืนได้

fetchone ()

ดึงข้อมูลบันทึกถัดไปจากชุดผลลัพธ์ เป็นทูเพิลประกอบด้วยค่าของแต่ละคอลัมน์ของระเบียนที่ดึงมา

fetchall ()

ดึงข้อมูลที่เหลือทั้งหมดในรูปแบบของรายการสิ่งที่เพิ่มขึ้น ทูเพิลแต่ละตัวสอดคล้องกับหนึ่งเรคคอร์ดและมีค่าของแต่ละคอลัมน์ในตาราง

ตัวอย่างต่อไปนี้แสดงรายการระเบียนทั้งหมดในตารางนักเรียน

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()

หากคุณวางแผนที่จะใช้ฐานข้อมูล MySQL แทนฐานข้อมูล SQLite คุณต้องติดตั้ง PyMySQLโมดูลตามที่อธิบายไว้ข้างต้น ขั้นตอนทั้งหมดในกระบวนการเชื่อมต่อฐานข้อมูลเหมือนกันเนื่องจากฐานข้อมูล MySQL ถูกติดตั้งบนเซิร์ฟเวอร์ฟังก์ชัน connect () จึงต้องการ URL และข้อมูลรับรองการเข้าสู่ระบบ

import pymysql
con=pymysql.connect('localhost', 'root', '***')

สิ่งเดียวที่อาจแตกต่างกับ SQLite คือประเภทข้อมูลเฉพาะของ MySQL ในทำนองเดียวกันฐานข้อมูลที่เข้ากันได้กับ ODBC สามารถใช้กับ Python ได้โดยการติดตั้งโมดูล pyodbc

ฐานข้อมูลเชิงสัมพันธ์ใด ๆ เก็บข้อมูลในตาราง โครงสร้างตารางกำหนดประเภทข้อมูลของแอตทริบิวต์ซึ่งโดยพื้นฐานแล้วเป็นประเภทข้อมูลหลักเท่านั้นที่แมปกับชนิดข้อมูลในตัวที่เกี่ยวข้องของ Python อย่างไรก็ตามอ็อบเจ็กต์ที่ผู้ใช้กำหนดเองของ Python ไม่สามารถจัดเก็บและดึงข้อมูลไปยัง / จากตาราง SQL ได้อย่างต่อเนื่อง

นี่คือความแตกต่างระหว่างประเภท SQL และภาษาโปรแกรมเชิงวัตถุเช่น Python SQL ไม่มีชนิดข้อมูลที่เทียบเท่าสำหรับผู้อื่นเช่น dict, tuple, list หรือคลาสที่ผู้ใช้กำหนด

หากคุณต้องจัดเก็บออบเจ็กต์ในฐานข้อมูลเชิงสัมพันธ์แอ็ตทริบิวต์อินสแตนซ์นั้นควรถูกแยกโครงสร้างออกเป็นชนิดข้อมูล SQL ก่อนที่จะดำเนินการสอบถาม INSERT ในทางกลับกันข้อมูลที่ดึงมาจากตาราง SQL จะอยู่ในประเภทหลัก จะต้องสร้างวัตถุ Python ประเภทที่ต้องการโดยใช้เพื่อใช้ในสคริปต์ Python นี่คือจุดที่ Object Relational Mappers มีประโยชน์

ตัวทำแผนที่ความสัมพันธ์ของวัตถุ (ORM)

อัน Object Relation Mapper(ORM) คืออินเทอร์เฟซระหว่างคลาสและตาราง SQL คลาส Python ถูกแมปกับตารางบางตารางในฐานข้อมูลดังนั้นการแปลงระหว่างออบเจ็กต์และประเภท SQL จะดำเนินการโดยอัตโนมัติ

ชั้นเรียนของนักเรียนที่เขียนด้วยรหัส Python จะถูกจับคู่กับตารางนักเรียนในฐานข้อมูล เป็นผลให้การดำเนินการ CRUD ทั้งหมดทำได้โดยการเรียกใช้เมธอดตามลำดับของคลาส สิ่งนี้ช่วยลดความจำเป็นในการดำเนินการแบบสอบถาม SQL ที่เข้ารหัสยากในสคริปต์ Python

ดังนั้นไลบรารี ORM จึงทำหน้าที่เป็นเลเยอร์นามธรรมเหนือแบบสอบถาม SQL ดิบและสามารถช่วยในการพัฒนาแอปพลิเคชันอย่างรวดเร็ว SQLAlchemyเป็นตัวทำแผนที่เชิงสัมพันธ์วัตถุยอดนิยมสำหรับ Python การจัดการสถานะของโมเดลอ็อบเจ็กต์ใด ๆ จะซิงโครไนซ์กับแถวที่เกี่ยวข้องในตารางฐานข้อมูล

SQLALchemy library ประกอบด้วย ORM API และภาษานิพจน์ SQL (SQLAlchemy Core). ภาษานิพจน์เรียกใช้โครงสร้างดั้งเดิมของฐานข้อมูลเชิงสัมพันธ์โดยตรง

ORM เป็นรูปแบบการใช้งานระดับสูงและเป็นนามธรรมที่สร้างขึ้นจาก SQL Expression Language อาจกล่าวได้ว่า ORM เป็นการใช้งาน Expression Language เราจะพูดถึง SQLAlchemy ORM API และใช้ฐานข้อมูล SQLite ในหัวข้อนี้

SQLAlchemy สื่อสารกับฐานข้อมูลประเภทต่างๆผ่านการใช้งาน DBAPI ตามลำดับโดยใช้ระบบภาษาถิ่น ภาษาถิ่นทั้งหมดต้องการให้ติดตั้งไดรเวอร์ DBAPI ที่เหมาะสม รวมภาษาสำหรับฐานข้อมูลประเภทต่อไปนี้ -

  • Firebird
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • PostgreSQL
  • SQLite
  • Sybase

การติดตั้ง SQLAlchemy นั้นง่ายและตรงไปตรงมาโดยใช้ยูทิลิตี้ pip

pip install sqlalchemy

หากต้องการตรวจสอบว่า SQLalchemy ได้รับการติดตั้งและเวอร์ชันอย่างถูกต้องหรือไม่ให้ป้อนคำต่อไปนี้ใน Python prompt -

>>> import sqlalchemy
>>>sqlalchemy.__version__
'1.3.11'

การโต้ตอบกับฐานข้อมูลทำได้ผ่านอ็อบเจ็กต์ Engine ที่ได้รับเป็นค่าส่งคืนของ create_engine() ฟังก์ชัน

engine =create_engine('sqlite:///mydb.sqlite')

SQLite อนุญาตให้สร้างฐานข้อมูลในหน่วยความจำ โปรแกรม SQLAlchemy สำหรับฐานข้อมูลในหน่วยความจำถูกสร้างขึ้นดังนี้ -

from sqlalchemy import create_engine
engine=create_engine('sqlite:///:memory:')

หากคุณต้องการใช้ฐานข้อมูล MySQL แทนให้ใช้โมดูล DB-API - pymysql และไดร์เวอร์ภาษาถิ่นตามลำดับ

engine = create_engine('mysql+pymydsql://root@localhost/mydb')

create_engine มีอาร์กิวเมนต์ echo ที่เป็นทางเลือก หากตั้งค่าเป็นจริงแบบสอบถาม SQL ที่สร้างโดยเอ็นจิ้นจะสะท้อนบนเทอร์มินัล

SQLAlchemy ประกอบด้วย declarative baseชั้นเรียน. ทำหน้าที่เป็นแคตตาล็อกของคลาสโมเดลและตารางที่แมป

from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()

ขั้นตอนต่อไปคือการกำหนดคลาสโมเดล มันต้องได้มาจาก base - object ของคลาส declarative_base ตามด้านบน

ตั้งค่า __tablename__ เพื่อตั้งชื่อตารางที่คุณต้องการสร้างในฐานข้อมูล แอตทริบิวต์อื่น ๆ สอดคล้องกับฟิลด์ แต่ละอันเป็นวัตถุคอลัมน์ใน SQLAlchemy และประเภทข้อมูลมาจากรายการใดรายการหนึ่งด้านล่าง -

  • BigInteger
  • Boolean
  • Date
  • DateTime
  • Float
  • Integer
  • Numeric
  • SmallInteger
  • String
  • Text
  • Time

โค้ดต่อไปนี้คือคลาสโมเดลที่มีชื่อว่า Student ที่แมปกับตาราง 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)

ในการสร้างตารางนักเรียนที่มีโครงสร้างที่สอดคล้องกันให้รันเมธอด create_all () ที่กำหนดไว้สำหรับคลาสฐาน

base.metadata.create_all(engine)

ตอนนี้เราต้องประกาศเรื่องของคลาสนักเรียนของเรา ธุรกรรมฐานข้อมูลทั้งหมดเช่นเพิ่มลบหรือดึงข้อมูลจากฐานข้อมูล ฯลฯ ถูกจัดการโดยวัตถุเซสชัน

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()

ข้อมูลที่จัดเก็บไว้ในวัตถุของนักเรียนจะถูกเพิ่มทางกายภาพในตารางพื้นฐานโดยวิธีการ add () ของเซสชัน

s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()

นี่คือรหัสทั้งหมดสำหรับการเพิ่มบันทึกในตารางนักเรียน ขณะที่ดำเนินการบันทึกคำสั่ง SQL ที่เกี่ยวข้องจะแสดงบนคอนโซล

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()

เอาต์พุตคอนโซล

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

session นอกจากนี้ยังมีวิธี add_all () เพื่อแทรกวัตถุมากกว่าหนึ่งรายการในธุรกรรมเดียว

sessionobj.add_all([s2,s3,s4,s5])
sessionobj.commit()

ตอนนี้มีการเพิ่มระเบียนในตารางแล้วเราต้องการดึงข้อมูลจากมันเช่นเดียวกับแบบสอบถาม SELECT วัตถุเซสชันมีเมธอด query () เพื่อดำเนินงาน วัตถุแบบสอบถามจะถูกส่งกลับโดยวิธีการ query () ในแบบจำลองนักเรียนของเรา

qry=seesionobj.query(Student)

ใช้เมธอด get () ของอ็อบเจ็กต์ Query นี้ดึงอ็อบเจ็กต์ที่สอดคล้องกับคีย์หลักที่กำหนด

S1=qry.get(1)

ในขณะที่ดำเนินการคำสั่งนี้คำสั่ง SQL ที่สอดคล้องกันที่สะท้อนบนคอนโซลจะเป็นดังนี้ -

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,)

วิธีการ query.all () ส่งคืนรายการของวัตถุทั้งหมดที่สามารถข้ามผ่านได้โดยใช้ลูป

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)

การอัปเดตเรกคอร์ดในตารางที่แมปนั้นทำได้ง่ายมาก สิ่งที่คุณต้องทำคือดึงเร็กคอร์ดโดยใช้เมธอด get () กำหนดค่าใหม่ให้กับแอ็ตทริบิวต์ที่ต้องการจากนั้นยอมรับการเปลี่ยนแปลงโดยใช้วัตถุเซสชัน ด้านล่างเราเปลี่ยนเครื่องหมายของนักเรียน Juhi เป็น 100

S1=qry.get(1)
S1.marks=100
sessionobj.commit()

การลบเรกคอร์ดทำได้ง่ายเพียงแค่ลบออบเจ็กต์ที่ต้องการออกจากเซสชัน

S1=qry.get(1)
Sessionobj.delete(S1)
sessionobj.commit()

MongoDB เป็นเอกสารที่มุ่งเน้น NoSQLฐานข้อมูล. เป็นฐานข้อมูลข้ามแพลตฟอร์มที่เผยแพร่ภายใต้ใบอนุญาตสาธารณะฝั่งเซิร์ฟเวอร์ ใช้ JSON เหมือนเอกสารเป็นสคีมา

เพื่อให้มีความสามารถในการจัดเก็บข้อมูลขนาดใหญ่จะมีการเชื่อมต่อเซิร์ฟเวอร์จริงมากกว่าหนึ่งเครื่อง (เรียกว่าชาร์ด) เพื่อให้สามารถปรับขนาดได้ตามแนวนอน ฐานข้อมูล MongoDB ประกอบด้วยเอกสาร

เอกสารมีลักษณะคล้ายกับแถวในตารางฐานข้อมูลเชิงสัมพันธ์ อย่างไรก็ตามไม่มีสคีมาเฉพาะ เอกสารคือชุดของคู่คีย์ - ค่า - คล้ายกับพจนานุกรม อย่างไรก็ตามจำนวนคู่ kv ในเอกสารแต่ละฉบับอาจแตกต่างกันไป เช่นเดียวกับตารางในฐานข้อมูลเชิงสัมพันธ์มีคีย์หลักเอกสารในฐานข้อมูล MongoDB มีคีย์พิเศษที่เรียกว่า"_id".

ก่อนที่เราจะดูว่าฐานข้อมูล MongoDB ใช้กับ Python อย่างไรให้เราเข้าใจสั้น ๆ เกี่ยวกับวิธีการติดตั้งและเริ่มต้น MongoDB MongoDB เวอร์ชันชุมชนและเชิงพาณิชย์มีให้บริการ รุ่นชุมชนสามารถดาวน์โหลดได้จากwww.mongodb.com/download-center/community

สมมติว่ามีการติดตั้ง MongoDB ใน c: \ mongodb เซิร์ฟเวอร์สามารถเรียกใช้โดยใช้คำสั่งต่อไปนี้

c:\mongodb\bin>mongod

เซิร์ฟเวอร์ MongoDB ทำงานที่พอร์ตหมายเลข 22017 ตามค่าเริ่มต้น ฐานข้อมูลจะถูกเก็บไว้ในโฟลเดอร์ data / bin ตามค่าเริ่มต้นแม้ว่าตำแหน่งสามารถเปลี่ยนแปลงได้โดยตัวเลือก –dbpath

MongoDB มีชุดคำสั่งของตัวเองที่จะใช้ใน MongoDB shell ในการเรียกใช้เชลล์ให้ใช้Mongo คำสั่ง

x:\mongodb\bin>mongo

เชลล์พร้อมต์ที่คล้ายกับ MySQL หรือ SQLite shell prompt ปรากฏขึ้นก่อนที่คำสั่ง NoSQL ดั้งเดิมที่สามารถเรียกใช้งานได้ อย่างไรก็ตามเราสนใจที่จะเชื่อมต่อฐานข้อมูล MongoDB กับ Python

PyMongoโมดูลได้รับการพัฒนาโดย MongoDB Inc เองเพื่อให้มีอินเตอร์เฟสการเขียนโปรแกรม Python ใช้ยูทิลิตี้ pip ที่รู้จักกันดีเพื่อติดตั้ง PyMongo

pip3 install pymongo

สมมติว่าเซิร์ฟเวอร์ MongoDB ทำงานอยู่ (ด้วย mongod คำสั่ง) และกำลังฟังที่พอร์ต 22017 ก่อนอื่นเราต้องประกาศไฟล์ MongoClientวัตถุ. ควบคุมธุรกรรมทั้งหมดระหว่างเซสชัน Python และฐานข้อมูล

from pymongo import MongoClient
client=MongoClient()

ใช้อ็อบเจ็กต์ไคลเอนต์นี้เพื่อสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ MongoDB

client = MongoClient('localhost', 27017)

ฐานข้อมูลใหม่ถูกสร้างขึ้นด้วยคำสั่งต่อไปนี้

db=client.newdb

ฐานข้อมูล MongoDB สามารถมีหลายคอลเลกชันคล้ายกับตารางในฐานข้อมูลเชิงสัมพันธ์ วัตถุคอลเลกชันถูกสร้างขึ้นโดยCreate_collection() ฟังก์ชัน

db.create_collection('students')

ตอนนี้เราสามารถเพิ่มเอกสารอย่างน้อยหนึ่งรายการในคอลเล็กชันได้ดังนี้ -

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()

ในการดึงเอกสาร (คล้ายกับแบบสอบถาม SELECT) เราควรใช้ find()วิธี. จะส่งคืนเคอร์เซอร์ด้วยความช่วยเหลือซึ่งสามารถรับเอกสารทั้งหมดได้

students=db['students']
docs=students.find()
for doc in docs:
   print (doc['Name'], doc['age'], doc['marks'] )

ในการค้นหาเอกสารเฉพาะแทนที่จะเป็นเอกสารทั้งหมดในคอลเล็กชันเราจำเป็นต้องใช้ตัวกรองเพื่อค้นหา () วิธีการ ตัวกรองใช้ตัวดำเนินการทางตรรกะ MongoDB มีชุดตัวดำเนินการเชิงตรรกะของตัวเองดังต่อไปนี้ -

ซีเนียร์ No ตัวดำเนินการ MongoDB และตัวดำเนินการเชิงตรรกะแบบดั้งเดิม
1

$eq

เท่ากับ (==)

2

$gt

มากกว่า (>)

3

$gte

มากกว่าหรือเท่ากับ (> =)

4

$in

ถ้าเท่ากับค่าใด ๆ ในอาร์เรย์

5

$lt

น้อยกว่า (<)

6

$lte

น้อยกว่าหรือเท่ากับ (<=)

7

$ne

ไม่เท่ากับ (! =)

8

$nin

ถ้าไม่เท่ากับค่าใด ๆ ในอาร์เรย์

ตัวอย่างเช่นเราสนใจรับรายชื่อนักเรียนที่มีอายุมากกว่า 21 ปี ใช้ตัวดำเนินการ $ gt ในตัวกรองสำหรับfind() วิธีการดังนี้ -

students=db['students']
docs=students.find({'age':{'$gt':21}})
for doc in docs:
   print (doc.get('Name'), doc.get('age'), doc.get('marks'))

โมดูล PyMongo ให้ update_one() และ update_many() วิธีการแก้ไขเอกสารหนึ่งเอกสารหรือมากกว่าหนึ่งเอกสารที่เป็นไปตามนิพจน์ตัวกรองเฉพาะ

ให้เราอัปเดตเครื่องหมายแอตทริบิวต์ของเอกสารที่ชื่อ 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 เป็นฐานข้อมูล NoSQL ยอดนิยมอีกตัว ความสามารถในการปรับขนาดความสม่ำเสมอและความทนทานต่อข้อผิดพลาดสูง - นี่คือคุณสมบัติที่สำคัญบางประการของ Cassandra นี่คือColumn storeฐานข้อมูล. ข้อมูลจะถูกเก็บไว้ในเซิร์ฟเวอร์สินค้าจำนวนมาก เป็นผลให้มีข้อมูลสูง

Cassandra เป็นผลิตภัณฑ์จาก Apache Software foundation ข้อมูลจะถูกจัดเก็บในลักษณะกระจายในหลาย ๆ โหนด แต่ละโหนดเป็นเซิร์ฟเวอร์เดียวที่ประกอบด้วยคีย์สเปซ โครงสร้างพื้นฐานของฐานข้อมูล Cassandra คือkeyspace ซึ่งถือได้ว่าคล้ายคลึงกับฐานข้อมูล

ข้อมูลในโหนดหนึ่งของ Cassandra ถูกจำลองแบบในโหนดอื่น ๆ บนเครือข่ายโหนดแบบเพียร์ทูเพียร์ นั่นทำให้ Cassandra เป็นฐานข้อมูลที่เข้าใจผิดได้ เครือข่ายเรียกว่าศูนย์ข้อมูล อาจมีการเชื่อมต่อศูนย์ข้อมูลหลายแห่งเพื่อสร้างคลัสเตอร์ ลักษณะของการจำลองแบบได้รับการกำหนดค่าโดยการตั้งค่ากลยุทธ์การจำลองและปัจจัยการจำลองขณะที่สร้างคีย์สเปซ

หนึ่งคีย์สเปซอาจมีมากกว่าหนึ่งตระกูลคอลัมน์เช่นเดียวกับที่ฐานข้อมูลเดียวอาจมีหลายตาราง คีย์สเปซของ Cassandra ไม่มีสคีมาที่กำหนดไว้ล่วงหน้า เป็นไปได้ว่าแต่ละแถวในตาราง Cassandra อาจมีคอลัมน์ที่มีชื่อแตกต่างกันและมีตัวเลขตัวแปร

ซอฟต์แวร์ Cassandra มีให้เลือกสองเวอร์ชัน: ชุมชนและองค์กร Cassandra เวอร์ชันล่าสุดสำหรับองค์กรสามารถดาวน์โหลดได้ที่https://cassandra.apache.org/download/. พบฉบับชุมชนที่https://academy.datastax.com/planet-cassandra/cassandra.

Cassandra มีภาษาแบบสอบถามของตัวเองที่เรียกว่า Cassandra Query Language (CQL). แบบสอบถาม CQL สามารถดำเนินการจากภายในเชลล์ CQLASH - คล้ายกับ MySQL หรือ SQLite เชลล์ ไวยากรณ์ CQL ดูเหมือนกับ SQL มาตรฐาน

รุ่นชุมชน Datastax ยังมาพร้อมกับ Develcenter IDE ที่แสดงในรูปต่อไปนี้ -

โมดูล Python สำหรับทำงานกับฐานข้อมูล Cassandra เรียกว่า Cassandra Driver. นอกจากนี้ยังพัฒนาโดยมูลนิธิ Apache โมดูลนี้ประกอบด้วย ORM API เช่นเดียวกับ API หลักที่คล้ายคลึงกับ DB-API สำหรับฐานข้อมูลเชิงสัมพันธ์

การติดตั้งไดรเวอร์ Cassandra ทำได้อย่างง่ายดายโดยใช้ pip utility.

pip3 install cassandra-driver

การโต้ตอบกับฐานข้อมูล Cassandra ทำได้ผ่านวัตถุคลัสเตอร์ โมดูล Cassandra.cluster กำหนดคลาสคลัสเตอร์ ก่อนอื่นเราต้องประกาศวัตถุคลัสเตอร์

from cassandra.cluster import Cluster
clstr=Cluster()

ธุรกรรมทั้งหมดเช่นแทรก / อัปเดต ฯลฯ ดำเนินการโดยเริ่มเซสชันด้วยคีย์สเปซ

session=clstr.connect()

ในการสร้างคีย์สเปซใหม่ให้ใช้ execute()วิธีการของวัตถุเซสชัน เมธอด execute () ใช้อาร์กิวเมนต์สตริงซึ่งต้องเป็นสตริงเคียวรี CQL มีคำสั่ง CREATE KEYSPACE ดังนี้ รหัสที่สมบูรณ์มีดังต่อไปนี้ -

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect()
session.execute(“create keyspace mykeyspace with replication={
   'class': 'SimpleStrategy', 'replication_factor' : 3
};”

ที่นี่ SimpleStrategy เป็นค่าสำหรับ replication strategy และ replication factorถูกตั้งค่าเป็น 3 ตามที่กล่าวไว้ก่อนหน้านี้คีย์สเปซประกอบด้วยตารางอย่างน้อยหนึ่งตาราง แต่ละตารางมีลักษณะข้อมูลประเภท IT ประเภทข้อมูล Python จะถูกแยกวิเคราะห์โดยอัตโนมัติด้วยประเภทข้อมูล CQL ที่เกี่ยวข้องตามตารางต่อไปนี้ -

ประเภท Python ประเภท CQL
ไม่มี NULL
บูล บูลีน
ลอย ลอยสองครั้ง
int ยาว int, bigint, varint, smallint, tinyint, counter
ทศนิยมทศนิยม ทศนิยม
str, Unicode ascii, varchar, ข้อความ
บัฟเฟอร์ bytearray หยด
วันที่ วันที่
วันเวลา การประทับเวลา
เวลา เวลา
รายการทูเพิลเครื่องกำเนิดไฟฟ้า รายการ
ชุด Frozenset ชุด
dict, OrderDict แผนที่
uuid.UUID timeuuid, uuid

ในการสร้างตารางให้ใช้วัตถุเซสชันเพื่อเรียกใช้แบบสอบถาม CQL สำหรับการสร้างตาราง

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)

คีย์สเปซที่สร้างขึ้นสามารถใช้เพิ่มเติมเพื่อแทรกแถวได้ แบบสอบถาม INSERT รุ่น CQL คล้ายกับคำสั่ง SQL Insert โค้ดต่อไปนี้แทรกแถวในตารางนักเรียน

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);"

ตามที่คุณคาดหวังคำสั่ง SELECT ยังใช้กับ Cassandra ในกรณีของ execute () method ที่มีสตริงเคียวรี SELECT จะส่งคืนอ็อบเจ็กต์ชุดผลลัพธ์ซึ่งสามารถข้ามผ่านโดยใช้ลูป

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]))

แบบสอบถาม SELECT ของ Cassandra สนับสนุนการใช้คำสั่ง WHERE เพื่อใช้ตัวกรองกับชุดผลลัพธ์ที่จะดึงข้อมูล ตัวดำเนินการทางตรรกะแบบดั้งเดิมเช่น <,> == เป็นต้นได้รับการยอมรับ ในการดึงข้อมูลเฉพาะแถวเหล่านั้นจากตารางนักเรียนสำหรับชื่อที่มีอายุ> 20 สตริงเคียวรีในเมธอด execute () ควรเป็นดังนี้ -

rows=session.execute("select * from students WHERE age>20 allow filtering;")

หมายเหตุการใช้ ALLOW FILTERING. ส่วนอนุญาตการกรองของคำสั่งนี้อนุญาตอย่างชัดเจน (บางส่วน) การสืบค้นที่ต้องการการกรอง

API ไดรเวอร์ Cassandra กำหนดประเภทของ Statement ต่อไปนี้ในโมดูล cassendra.query

SimpleStatement

แบบสอบถาม CQL แบบง่ายที่ไม่ได้เตรียมไว้ในสตริงแบบสอบถาม ตัวอย่างทั้งหมดข้างต้นเป็นตัวอย่างของ SimpleStatement

BatchStatement

การสืบค้นข้อมูลจำนวนมาก (เช่น INSERT, UPDATE และ DELETE) จะรวมอยู่ในชุดและดำเนินการพร้อมกัน แต่ละแถวจะถูกแปลงเป็น SimpleStatement ก่อนจากนั้นจึงเพิ่มในชุดงาน

ให้เราใส่แถวที่จะเพิ่มในตารางนักเรียนในรูปแบบของรายการสิ่งต่อไปนี้ -

studentlist=[(1,'Juhi',20,100), ('2,'dilip',20, 110),(3,'jeevan',24,145)]

หากต้องการเพิ่มแถวด้านบนโดยใช้ BathStatement ให้เรียกใช้สคริปต์ต่อไปนี้ -

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)

เตรียมพร้อม

คำสั่งที่เตรียมไว้ก็เหมือนกับคิวรีที่กำหนดพารามิเตอร์ใน DB-API Cassandra บันทึกสตริงการสืบค้นไว้เพื่อใช้ในภายหลัง วิธี Session.prepare () ส่งคืนอินสแตนซ์ PreparedStatement

สำหรับตารางนักเรียนของเราแบบสอบถาม PreparedStatement สำหรับ INSERT มีดังนี้ -

stmt=session.prepare("INSERT INTO students (studentID, name, age, marks) VALUES (?,?,?)")

จากนั้นจะต้องส่งค่าของพารามิเตอร์เพื่อผูกเท่านั้น ตัวอย่างเช่น -

qry=stmt.bind([1,'Ram', 23,175])

สุดท้ายดำเนินการคำสั่งผูกไว้ข้างต้น

session.execute(qry)

ซึ่งจะช่วยลดปริมาณการใช้งานเครือข่ายและการใช้งาน CPU เนื่องจาก Cassandra ไม่จำเป็นต้องแยกวิเคราะห์แบบสอบถามใหม่ทุกครั้ง

ZODB (Zope object Database) เป็นฐานข้อมูลสำหรับจัดเก็บวัตถุ Python เป็นไปตาม ACID - ไม่พบคุณลักษณะในฐานข้อมูล NOSQL ZODB ยังเป็นโอเพนซอร์สที่ปรับขนาดได้ในแนวนอนและไม่มีสคีมาเช่นเดียวกับฐานข้อมูล NoSQL จำนวนมาก อย่างไรก็ตามไม่มีการแจกจ่ายและไม่มีการจำลองแบบง่าย มีกลไกการคงอยู่สำหรับวัตถุ Python เป็นส่วนหนึ่งของเซิร์ฟเวอร์ Zope Application แต่ยังสามารถใช้งานได้อย่างอิสระ

ZODB สร้างโดย Jim Fulton จาก Zope Corporation เริ่มต้นเป็นระบบวัตถุถาวรอย่างง่าย เวอร์ชันปัจจุบันคือ 5.5.0 และเขียนด้วย Python อย่างสมบูรณ์ ใช้การคงอยู่ของวัตถุในตัวของ Python (ดอง) เวอร์ชันเพิ่มเติม

คุณสมบัติหลักบางประการของ ZODB ได้แก่ -

  • transactions
  • history/undo
  • ที่เก็บข้อมูลแบบเสียบได้อย่างโปร่งใส
  • แคชในตัว
  • การควบคุมภาวะพร้อมกันหลายทาง (MVCC)
  • ความสามารถในการปรับขนาดผ่านเครือข่าย

ZODB คือไฟล์ hierarchicalฐานข้อมูล. มีอ็อบเจ็กต์รูทเริ่มต้นเมื่อสร้างฐานข้อมูล อ็อบเจ็กต์รูทถูกใช้เหมือนพจนานุกรม Python และสามารถมีอ็อบเจ็กต์อื่น ๆ (ซึ่งสามารถเป็นเหมือนพจนานุกรมได้) ในการจัดเก็บวัตถุในฐานข้อมูลก็เพียงพอที่จะกำหนดให้กับคีย์ใหม่ภายในคอนเทนเนอร์

ZODB มีประโยชน์สำหรับแอปพลิเคชันที่ข้อมูลเป็นแบบลำดับชั้นและมีแนวโน้มที่จะอ่านได้มากกว่าการเขียน ZODB เป็นส่วนขยายของวัตถุดอง นั่นเป็นเหตุผลที่สามารถประมวลผลผ่านสคริปต์ Python เท่านั้น

ในการติดตั้ง ZODB เวอร์ชันล่าสุดให้ใช้ยูทิลิตี้ pip -

pip install zodb

ยังติดตั้งการอ้างอิงต่อไปนี้ -

  • BTrees==4.6.1
  • cffi==1.13.2
  • persistent==4.5.1
  • pycparser==2.19
  • six==1.13.0
  • transaction==2.4.0

ZODB มีตัวเลือกการจัดเก็บดังต่อไปนี้ -

FileStorage

นี่คือค่าเริ่มต้น ทุกอย่างเก็บไว้ในไฟล์ Data.fs ขนาดใหญ่ไฟล์เดียวซึ่งโดยพื้นฐานแล้วจะเป็นบันทึกธุรกรรม

DirectoryStorage

ซึ่งเก็บหนึ่งไฟล์ต่อการแก้ไขอ็อบเจ็กต์ ในกรณีนี้ไม่จำเป็นต้องสร้าง Data.fs.index ขึ้นมาใหม่เมื่อปิดระบบที่ไม่สะอาด

RelStorage

นี้จัดเก็บผักดองในฐานข้อมูลเชิงสัมพันธ์ รองรับ PostgreSQL, MySQL และ Oracle

ในการสร้างฐานข้อมูล ZODB เราจำเป็นต้องมีที่เก็บข้อมูลฐานข้อมูลและสุดท้ายคือการเชื่อมต่อ

ขั้นตอนแรกคือการมีวัตถุจัดเก็บ

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('mydata.fs')

คลาส DB ใช้อ็อบเจ็กต์หน่วยเก็บข้อมูลนี้เพื่อรับอ็อบเจ็กต์ฐานข้อมูล

db = ZODB.DB(storage)

ส่งผ่าน None ไปยัง DB constructor เพื่อสร้างฐานข้อมูลในหน่วยความจำ

Db=ZODB.DB(None)

สุดท้ายเราสร้างการเชื่อมต่อกับฐานข้อมูล

conn=db.open()

จากนั้นอ็อบเจ็กต์การเชื่อมต่อจะให้คุณเข้าถึง 'root' ของฐานข้อมูลด้วยเมธอด 'root ()' อ็อบเจ็กต์ 'root' คือพจนานุกรมที่เก็บอ็อบเจ็กต์ถาวรทั้งหมดของคุณ

root = conn.root()

ตัวอย่างเช่นเราเพิ่มรายชื่อนักเรียนไปยังวัตถุรากดังนี้ -

root['students'] = ['Mary', 'Maya', 'Meet']

การเปลี่ยนแปลงนี้จะไม่ถูกบันทึกอย่างถาวรในฐานข้อมูลจนกว่าเราจะทำธุรกรรม

import transaction
transaction.commit()

ในการจัดเก็บอ็อบเจ็กต์ของคลาสที่ผู้ใช้กำหนดคลาสจะต้องสืบทอดจากคลาสพาเรนต์แบบถาวร

ข้อดีของ Subclassing

Subclassing คลาส Persistent มีข้อดีดังนี้ -

  • ฐานข้อมูลจะติดตามการเปลี่ยนแปลงวัตถุโดยอัตโนมัติโดยการตั้งค่าแอตทริบิวต์

  • ข้อมูลจะถูกบันทึกไว้ในบันทึกฐานข้อมูลของตัวเอง

  • คุณสามารถบันทึกข้อมูลที่ไม่ใช่คลาสย่อยถาวร แต่จะถูกเก็บไว้ในเรกคอร์ดฐานข้อมูลของสิ่งที่ออบเจ็กต์ถาวรอ้างอิง อ็อบเจ็กต์ที่ไม่ถาวรเป็นของอ็อบเจ็กต์ที่มีถาวรและหากอ็อบเจ็กต์ถาวรหลายตัวอ้างถึงอ็อบเจ็กต์ย่อยที่ไม่ถาวรเดียวกันอ็อบเจ็กต์เหล่านั้นจะได้รับสำเนาของตัวเอง

ให้ใช้กำหนดคลาสย่อยคลาสของนักเรียนที่เป็นคลาสที่อยู่ภายใต้ -

import persistent
   class student(persistent.Persistent):
   def __init__(self, name):
      self.name = name
   def __repr__(self):
      return str(self.name)

ในการเพิ่มออบเจ็กต์ของคลาสนี้ให้เราตั้งค่าการเชื่อมต่อตามที่อธิบายไว้ข้างต้นก่อน

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('studentdata.fs')
db = ZODB.DB(storage)
conn=db.open()
root = conn.root()

ประกาศอ็อบเจ็กต์เพิ่มไปยังรูทจากนั้นคอมมิตธุรกรรม

s1=student("Akash")
root['s1']=s1
import transaction
transaction.commit()
conn.close()

รายการของอ็อบเจ็กต์ทั้งหมดที่เพิ่มในรูทสามารถเรียกดูเป็นอ็อบเจ็กต์มุมมองได้ด้วยความช่วยเหลือของวิธี items () เนื่องจากอ็อบเจ็กต์รูทนั้นคล้ายกับในพจนานุกรม

print (root.items())
ItemsView({'s1': Akash})

ในการดึงแอตทริบิวต์ของวัตถุเฉพาะจากรูท

print (root['s1'].name)
Akash

สามารถปรับปรุงวัตถุได้อย่างง่ายดาย เนื่องจาก ZODB API เป็นแพ็คเกจ Python แท้จึงไม่จำเป็นต้องใช้ภาษาประเภท SQL ภายนอกใด ๆ

root['s1'].name='Abhishek'
import transaction
transaction.commit()

ฐานข้อมูลจะได้รับการอัปเดตทันที โปรดสังเกตว่าคลาสธุรกรรมยังกำหนดฟังก์ชัน abort () ซึ่งคล้ายกับการควบคุมธุรกรรม rollback () ใน SQL

Excel ของ Microsoft เป็นแอปพลิเคชันสเปรดชีตที่ได้รับความนิยมมากที่สุด มีการใช้งานมานานกว่า 25 ปี ใช้ Excel เวอร์ชันที่ใหม่กว่าOffice Open XML (OOXML) รูปแบบไฟล์ ดังนั้นจึงสามารถเข้าถึงไฟล์สเปรดชีตผ่านสภาพแวดล้อมการเขียนโปรแกรมอื่น ๆ ได้

OOXMLเป็นรูปแบบไฟล์มาตรฐาน ECMA Python ของopenpyxl แพคเกจมีฟังก์ชันในการอ่าน / เขียนไฟล์ Excel ที่มีนามสกุล. xlsx

แพคเกจ openpyxl ใช้ระบบการตั้งชื่อคลาสที่คล้ายกับคำศัพท์ของ Microsoft Excel เอกสาร Excel เรียกว่าเป็นสมุดงานและบันทึกด้วยนามสกุล. xlsx ในระบบไฟล์ สมุดงานอาจมีหลายแผ่นงาน เวิร์กชีตแสดงตารางเซลล์ขนาดใหญ่แต่ละเซลล์สามารถจัดเก็บค่าหรือสูตรได้ แถวและคอลัมน์ที่สร้างตารางจะมีหมายเลขกำกับ คอลัมน์ถูกระบุด้วยตัวอักษร A, B, C, …., Z, AA, AB และอื่น ๆ แถวจะมีหมายเลขเริ่มจาก 1

แผ่นงาน Excel ทั่วไปจะปรากฏดังนี้ -

ยูทิลิตี้ pip นั้นดีพอที่จะติดตั้งแพ็คเกจ openpyxl

pip install openpyxl

คลาสสมุดงานแสดงถึงสมุดงานเปล่าที่มีแผ่นงานเปล่าหนึ่งแผ่น เราจำเป็นต้องเปิดใช้งานเพื่อให้สามารถเพิ่มข้อมูลบางอย่างลงในแผ่นงานได้

from openpyxl import Workbook
wb=Workbook()
sheet1=wb.active
sheet1.title='StudentList'

ดังที่เราทราบเซลล์ในแผ่นงานมีชื่อเป็นรูปแบบ ColumnNameRownumber ดังนั้นเซลล์ด้านซ้ายบนคือ A1 เรากำหนดสตริงให้กับเซลล์นี้เป็น -

sheet1['A1']= 'Student List'

หรือใช้แผ่นงาน cell()วิธีการที่ใช้หมายเลขแถวและคอลัมน์เพื่อระบุเซลล์ เรียกคุณสมบัติมูลค่าไปยังวัตถุเซลล์เพื่อกำหนดค่า

cell1=sheet1.cell(row=1, column=1)
cell1.value='Student List'

หลังจากเติมข้อมูลในเวิร์กชีตแล้วเวิร์กบุ๊กจะถูกบันทึกโดยเรียกเมธอด save () ของอ็อบเจ็กต์สมุดงาน

wb.save('Student.xlsx')

ไฟล์สมุดงานนี้สร้างขึ้นในไดเร็กทอรีการทำงานปัจจุบัน

ตามสคริปต์ Python จะเขียนรายการสิ่งที่เพิ่มลงในเอกสารสมุดงาน ทูเปิลแต่ละตัวเก็บหมายเลขม้วนอายุและเครื่องหมายของนักเรียน

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')

สมุดงาน students.xlsx ถูกบันทึกไว้ในไดเร็กทอรีการทำงานปัจจุบัน หากเปิดโดยใช้แอปพลิเคชัน Excel จะปรากฏดังต่อไปนี้ -

โมดูล openpyxl นำเสนอ load_workbook() ฟังก์ชันที่ช่วยในการอ่านข้อมูลย้อนกลับในเอกสารสมุดงาน

from openpyxl import load_workbook
wb=load_workbook('students.xlsx')

ตอนนี้คุณสามารถเข้าถึงค่าของเซลล์ใดก็ได้ที่ระบุตามหมายเลขแถวและคอลัมน์

cell1=sheet1.cell(row=1, column=1)
print (cell1.value)
Student List

ตัวอย่าง

รหัสต่อไปนี้จะเติมข้อมูลในรายการด้วยข้อมูลแผ่นงาน

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)

เอาต์พุต

[('RollNo', 'Name', 'age', 'marks'), (1, 'Juhi', 20, 100), (2, 'dilip', 20, 110), (3, 'jeevan', 24, 145)]

คุณสมบัติที่สำคัญอย่างหนึ่งของแอปพลิเคชัน Excel คือสูตร ในการกำหนดสูตรให้กับเซลล์ให้กำหนดเป็นสตริงที่มีไวยากรณ์ของสูตรของ Excel กำหนดฟังก์ชัน AVERAGE ให้กับเซลล์ c6 ที่มีอายุ

sheet1['C6']= 'AVERAGE(C3:C5)'

โมดูล Openpyxl มี Translate_formula()เพื่อคัดลอกสูตรข้ามช่วง โปรแกรมต่อไปนี้กำหนดฟังก์ชัน AVERAGE ใน C6 และคัดลอกไปยัง C7 ที่คำนวณค่าเฉลี่ยของเครื่องหมาย

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')

ตอนนี้แผ่นงานที่เปลี่ยนแปลงจะปรากฏดังนี้ -