Trong bài viết này, chúng tôi giới thiệu cho bạn về tuần tự hóa đối tượng trong Python và giải thích tại sao nó lại quan trọng. Tuần tự hóa về cơ bản là một cách lưu trữ dữ liệu hoặc đối tượng và là một kỹ thuật hữu ích để lưu các đối tượng phức tạp. Đó là quá trình chuyển đổi một đối tượng thành luồng byte có thể được lưu trữ, chẳng hạn như trong bộ nhớ hoặc tệp. Sau đó, tệp này có thể được xây dựng lại hoặc giải tuần tự hóa để truy xuất đối tượng ban đầu, sau đó được sử dụng lại trong các chương trình khác nhau hoặc thậm chí các môi trường khác nhau
Dưới đây, chúng tôi chỉ cho bạn một số ví dụ về cách sử dụng một số công cụ phổ biến nhất để tuần tự hóa trong Python. Nếu bạn chưa quen với Python và muốn xây dựng kỹ năng xử lý dữ liệu của mình, hãy xem bản nhạc này. Nó dạy cho bạn tất cả những gì bạn cần biết về xử lý các định dạng tệp khác nhau bằng Python
Lớp cơ bản
Hãy nhớ rằng Python là một ngôn ngữ hướng đối tượng; . Điều này có nghĩa là bạn có thể tuần tự hóa dữ liệu được lưu trữ trong danh sách, từ điển hoặc thậm chí các thể hiện của lớp
Hãy tham gia và tạo một lớp học lái xe ô tô. Trọng tâm của bài viết này không phải là về các lớp học, vì vậy nếu bạn muốn biết thêm chi tiết về cách hoạt động của các lớp học, hãy xem bài viết này. Chúng tôi cũng có một số tài liệu dựa trên đó và chỉ cho bạn cách viết một mô-đun tùy chỉnh bằng Python
Một đối tượng trong Python có các thuộc tính [như thuộc tính của nó] và các phương thức [những thứ nó có thể làm]. Các thuộc tính quan trọng đối với loại ô tô của chúng tôi là mức nhiên liệu hiện tại và hiệu quả [lượng nhiên liệu tiêu thụ trên mỗi km]. Chúng được định nghĩa trong __init__[]
. Ô tô cũng có thể có một số hành động liên quan đến chúng, chẳng hạn như lái xe một khoảng cách nhất định. Đây là các phương thức lớp, được viết dưới dạng các hàm trong lớp
Lớp sau đây cho phép bạn lái ô tô một quãng đường nhất định với mức nhiên liệu và hiệu quả của nó
class Car: def __init__[self, efficiency, fuel_level]: self.efficiency = efficiency self.fuel_level = fuel_level def drive[self, distance]: max_distance = self.fuel_level * self.efficiency if distance > max_distance: print['Traveled %s km, out of fuel'%[max_distance]] self.fuel_level = 0 else: self.fuel_level -= distance / self.efficiency print['Arrived safely!']
Chúng ta có thể tạo một đối tượng ô tô với hiệu suất 5 km/L và mức nhiên liệu 12 L như sau
fast_car1 = Car[5, 12]
Hãy lái xe trong 8 km, sau đó kiểm tra mức nhiên liệu
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.4
Càng xa càng tốt. Bây giờ chúng tôi muốn sắp xếp lại đối tượng fast_car1
để chúng tôi có thể quay lại và sử dụng nó sau mà không cần phải khởi tạo lại nó. Nhập
fast_car1 = Car[5, 12]0
dưa chua
Mô-đun Python
fast_car1 = Car[5, 12]0 là một mô-đun dễ sử dụng để tuần tự hóa [chọn] và giải tuần tự hóa [bỏ chọn] các đối tượng trong Python. Một số lượng lớn các đối tượng có thể được chọn, bao gồm Booleans, số nguyên, số float và chuỗi, cũng như các cấu trúc dữ liệu như danh sách, từ điển, bộ, v.v. Các hàm và lớp có thể được tuần tự hóa, và như chúng ta sẽ thấy bên dưới, các thể hiện của lớp cũng vậy.
Mô-đun Python
fast_car1 = Car[5, 12]0 lưu trữ dữ liệu ở dạng nhị phân, do đó con người không thể đọc được. Nó đi kèm với bốn phương pháp. Hai cái chúng tôi sẽ sử dụng cho trường hợp của chúng tôi là
fast_car1 = Car[5, 12]3 và
fast_car1 = Car[5, 12]4, lần lượt lưu và tải các tệp dưa chua. Hai phương pháp khác là
fast_car1 = Car[5, 12]5 và
fast_car1 = Car[5, 12]6, sẽ sắp xếp các đối tượng mà không lưu chúng vào tệp
Chúng ta sẽ xem xét kỹ hơn hai cái đầu tiên bên dưới. Nhưng trước khi chúng tôi làm, một lời cảnh báo. như đã nêu trong tài liệu chính thức, mô-đun
fast_car1 = Car[5, 12]0 của Python không an toàn trước dữ liệu được xây dựng độc hại có thể thực thi mã nước ngoài. Do đó, không bao giờ giải nén dữ liệu nhận được từ một nguồn không đáng tin cậy
Sau khi tóm tắt về an toàn, chúng ta hãy tiếp tục với một ví dụ về pickling và unpickling trong Python
with open['fast_car_object.pkl', 'wb'] as out_file: pickle.dump[fast_car1, out_file]
Thực thi mã này sẽ tạo tệp
fast_car1 = Car[5, 12]8 trong thư mục làm việc hiện tại của bạn. Để giải nén tệp này, chỉ cần làm như sau
with open['fast_car_object.pkl', 'rb'] as in_file: fast_car2 = pickle.load[in_file]
Lưu ý các chế độ khác nhau mà chúng tôi sử dụng để tuần tự hóa ['
fast_car1 = Car[5, 12]9'] và giải tuần tự hóa ['
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.40']. Hai đối tượng
fast_car1
và >>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.42 là hai đối tượng riêng biệt với các vị trí khác nhau trong bộ nhớ; . Nhân tiện, nếu bạn chưa quen với việc sử dụng câu lệnh
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.43 để lưu tệp, thì đây là một số tài liệu về ghi vào tệp bằng Python
Chúng tôi đã đề cập hầu hết mọi thứ trong Python là một đối tượng. Danh sách là một đối tượng, có các thuộc tính và phương thức. Ví dụ:
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.44 là một cách dễ dàng để thêm dữ liệu tùy ý vào danh sách và
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.45 đảo ngược các phần tử. Còn nhiều điều nữa bạn nên làm quen. Bây giờ, hãy thử sắp xếp theo thứ tự một danh sách với
fast_car1 = Car[5, 12]0 như chúng tôi đã làm ở trên. Hoặc tốt hơn, hãy thử với từ điển. Cấu trúc dữ liệu lồng nhau sẽ hơi cồng kềnh khi lưu vào tệp CSV hoặc tệp văn bản, nhưng đó là cấu trúc hai chiều với mô-đun
fast_car1 = Car[5, 12]0
Tuần tự hóa JSON trong Python
JSON là viết tắt của JavaScript Object Notation và là một định dạng nhẹ để lưu trữ dữ liệu. Dữ liệu được lưu trữ ở định dạng này có cấu trúc tương tự như từ điển Python, vì vậy nó trông không quá xa lạ. Nếu bạn chưa quen làm việc với các tệp JSON, hãy xem khóa học này. Nó chứa các bài tập tương tác và dạy cho bạn tất cả những gì bạn cần biết
Python có một mô-đun,
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.48, rất hữu ích nếu bạn đang tìm cách mã hóa hoặc giải mã dữ liệu ở định dạng này. Lý do để chọn phương pháp này thay vì mô-đun
fast_car1 = Car[5, 12]0 bao gồm việc nó được tiêu chuẩn hóa và không phụ thuộc vào ngôn ngữ. Nó cũng an toàn hơn nhiều và con người có thể đọc được
Mô-đun
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.48 có thể được sử dụng để tuần tự hóa các đối tượng trong Python. Nó thực hiện bốn phương thức cơ bản giống như chúng ta đã thấy ở trên. Kiểm tra tài liệu để biết thêm thông tin và nhiều ví dụ khác
Hãy bắt đầu với một ví dụ đơn giản về tuần tự hóa một danh sách với mô-đun
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.48. Ở đây, chúng tôi sử dụng phương pháp
fast_car1 = Car[5, 12]5, phương thức này không lưu dữ liệu vào tệp mà thay vào đó tuần tự hóa nó thành một chuỗi
>>> import json >>> lst = [1, 2, 3, 'a', 'b', 'c'] >>> lst_dump = json.dumps[lst] >>> lst_dump '[1, 2, 3, "a", "b", "c"]'
Bây giờ, nếu chúng ta cố gắng tương tự để tuần tự hóa đối tượng fast_car1
mà chúng ta đã khởi tạo ở trên, chúng ta sẽ gặp sự cố
>>> car_dump = json.dumps[fast_car1] TypeError: Object of type Car is not JSON serializable
Bộ mã hóa JSON được triển khai trong các phương thức
fast_car1 = Car[5, 12]3 và
fast_car1 = Car[5, 12]5 chỉ có thể tuần tự hóa một số loại đối tượng cơ bản. Đây là từ điển, danh sách, chuỗi, số nguyên, số float, Booleans và Không. Các đối tượng phức tạp như
fast_car1
cần được tuần tự hóa tùy chỉnh thành định dạng JSON bằng cách xây dựng bộ mã hóa tùy chỉnh trong PythonViết một bộ mã hóa tùy chỉnh
Con đường phía trước về cơ bản tóm tắt là biểu diễn dữ liệu trong từ điển
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.48 có thể tuần tự hóa. Bạn tạo một lớp bộ mã hóa tùy chỉnh mở rộng lớp
with open['fast_car_object.pkl', 'wb'] as out_file: pickle.dump[fast_car1, out_file]8 trong mô-đun
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.48, sau đó sử dụng các phương thức
fast_car1 = Car[5, 12]3 hoặc
fast_car1 = Car[5, 12]5 bình thường
Hãy xem xét kỹ hơn một ví dụ. Ở đây, lớp Car giống như trên, và bây giờ có một lớp mới,
with open['fast_car_object.pkl', 'rb'] as in_file: fast_car2 = pickle.load[in_file]2
from json import JSONEncoder class Car: def __init__[self, efficiency, fuel_level]: self.efficiency = efficiency self.fuel_level = fuel_level def drive[self, distance]: max_distance = self.fuel_level * self.efficiency if distance > max_distance: print['Traveled %s km, out of fuel'%[max_distance]] self.fuel_level = 0 else: self.fuel_level -= distance / self.efficiency print['Arrived safely!'] class CarJSONEncoder[JSONEncoder]: def default[self, obj]: return obj.__dict__ Then to JSON serialize our object, we do the following: >>> fast_car1_json = json.dumps[fast_car1, cls=CarJSONEncoder] >>> fast_car1_json '{"efficiency": 5, "fuel_level": 10.4}'
Lớp tùy chỉnh của chúng tôi sử dụng
with open['fast_car_object.pkl', 'rb'] as in_file: fast_car2 = pickle.load[in_file]3, đây là thuộc tính tích hợp lưu trữ các thuộc tính của đối tượng dưới dạng cặp khóa/giá trị. Sau đó, chúng tôi chỉ định lớp tùy chỉnh của mình với đối số từ khóa
with open['fast_car_object.pkl', 'rb'] as in_file: fast_car2 = pickle.load[in_file]4 trong phương thức
fast_car1 = Car[5, 12]5. Đầu ra cho thấy đối tượng
fast_car1
của chúng tôi thực sự đã được tuần tự hóa JSONTốt nhất của cả hai thế giới
Cho đến nay, chúng ta đã khám phá hai phương pháp để tuần tự hóa các đối tượng trong Python. đầu tiên với mô-đun
fast_car1 = Car[5, 12]0 và thứ hai bằng cách tuần tự hóa thành JSON với mô-đun
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.48 và một lớp bộ mã hóa tùy chỉnh.
fast_car1 = Car[5, 12]0 rất thân thiện với người dùng nhưng con người không thể đọc được và không an toàn.
>>> fast_car1.drive[8] >>> fast_car1.fuel_level 10.48 thì ngược lại
Công việc khó khăn là kết hợp những gì tốt nhất của hai phương pháp này đã được thực hiện cho chúng tôi và có sẵn trong mô-đun
>>> import json >>> lst = [1, 2, 3, 'a', 'b', 'c'] >>> lst_dump = json.dumps[lst] >>> lst_dump '[1, 2, 3, "a", "b", "c"]'1 được đặt tên khéo léo. Mô-đun này cung cấp một bộ công cụ để tuần tự hóa các đối tượng Python phức tạp thành JSON và cũng xử lý việc giải tuần tự hóa.
>>> import json >>> lst = [1, 2, 3, 'a', 'b', 'c'] >>> lst_dump = json.dumps[lst] >>> lst_dump '[1, 2, 3, "a", "b", "c"]'1 xây dựng dựa trên các loại đối tượng cơ bản có thể tuần tự hóa JSON và cho phép các đối tượng phức tạp hơn được tuần tự hóa
Cách dễ nhất để bạn chạm tay vào mô-đun này là bằng một lệnh nhanh chóng
>>> import json >>> lst = [1, 2, 3, 'a', 'b', 'c'] >>> lst_dump = json.dumps[lst] >>> lst_dump '[1, 2, 3, "a", "b", "c"]'3. Mô-đun này đi kèm với cùng một nhãn cảnh báo đi kèm với
fast_car1 = Car[5, 12]0. Không sử dụng nó để giải tuần tự hóa dữ liệu từ một nguồn không đáng tin cậy
Chức năng của nó tương tự như những gì chúng ta đã thấy trong bài viết này, vì vậy chúng ta sẽ không đi sâu vào chi tiết ở đây. Không cần phải nói, nó đi kèm với phương pháp
>>> import json >>> lst = [1, 2, 3, 'a', 'b', 'c'] >>> lst_dump = json.dumps[lst] >>> lst_dump '[1, 2, 3, "a", "b", "c"]'5 để tuần tự hóa và giải mã[] để giải tuần tự hóa. Nó cũng có khả năng tùy biến cao. Kiểm tra tài liệu nếu bạn muốn biết thêm chi tiết và một số ví dụ nhanh
Tuần tự hóa đối tượng chính trong Python
Chúng tôi hy vọng chúng tôi đã làm sáng tỏ tuần tự hóa đối tượng trong Python là gì. Chúng tôi đã chỉ cho bạn một số công cụ hữu ích để giúp bạn quản lý tốt hơn các chương trình và dữ liệu của mình. Hãy chắc chắn rằng bạn đã nhúng tay vào và chơi xung quanh với các ví dụ được hiển thị ở đây. Sau đó, bạn sẽ nhanh chóng thành thạo một khía cạnh khác của Python