Học bằng cách đọc theo thứ tự

pickle và base64 — Serialization object và chuyển đổi binary sang text

Dùng pickle.dumps / loads để biến dict và class tự định nghĩa thành bytes rồi khôi phục đầy đủ, và base64.b64encode / b64decode để gửi binary qua đường text. Vừa chạy vừa xem kiểu trả về.

Ta sẽ tìm hiểu hai module dùng khi di chuyển dữ liệu qua file hoặc qua mạng. pickle lưu object Python (dict, instance của class, v.v.) dưới dạng có thể khôi phục đầy đủ sau này, còn base64 chuyển dữ liệu binary như ảnh hoặc âm thanh thành chuỗi "chữ số cộng hai ký hiệu" để bạn có thể nhét thẳng vào email, JSON, hay URL. Cả hai đều là module thư viện chuẩn cho chuyển đổi dữ liệu ở các ranh giới nội bộ hoặc kênh truyền bên ngoài.

Phân biệt mỗi module dùng cho việc gì

Hai module phân chia tự nhiên theo tổ hợp đầu vào/đầu ra. Hãy dùng sơ đồ dưới để nắm bức tranh tổng thể, rồi ta sẽ đào sâu vào các công dụng và API điển hình ở mỗi phần.

Vai trò của hai module
pickleobject ↔ bytesnội bộ / giữa tiến trìnhbase64binary ↔ ASCIItruyền tải (JSON/mail)
pickle làm object ↔ bytes (lưu trữ nội bộ, giữa các tiến trình); base64 làm binary ↔ văn bản ASCII (chuyển đổi cho truyền tải: JSON / mail / URL). Phạm vi của chúng không trùng nhau, nên đôi khi bạn sẽ kết hợp cả hai.

pickle — Chuyển object Python thẳng sang bytes

pickle là module thư viện chuẩn chuyển đổi object Python thành dạng có thể khôi phục đầy đủ sau này. Kết quả là giá trị bytes (chuỗi liên tục các số nguyên từ 0 đến 255 — kiểu dùng để xử lý "chuỗi số" thay vì "chuỗi ký tự" như chuỗi). Bytes là định dạng cơ bản cho tình huống máy, không phải người, sẽ đọc dữ liệu — lưu vào file, gửi qua mạng, chuyển dữ liệu cho tiến trình khác.

Bốn công dụng điển hình của pickle
lưu model MLfile model.pklchuyển giữa tiến trìnhmultiprocessingcache tính toánbỏ qua việc nặngtask queueCelery chuyển tham số
Lưu model ML / chuyển object giữa các tiến trình / cache các phép tính tốn kém / task queue. Điểm chung là tất cả đều ở bên trong thế giới Python — để giao tiếp với bên ngoài, hãy dùng json.

Khác với json, điểm mạnh của pickle là có thể lưu không chỉ dict / list / chuỗi / số mà còn cả instance của class tự định nghĩa và object hàm, nên hữu ích cho việc lưu model ML hoặc chuyển object giữa các tiến trình Python.

Tính đối xứng của pickle.dumps / loads
object Python(dict / instance / v.v.)pickle.dumpsbytes(dạng binary)bytes(dạng binary)pickle.loadsobject Python(dict / instance / v.v.)ghiđọc
Hàng trên: dumps = chiều object Python → bytes. Hàng dưới: loads = chiều bytes → object Python. Khác json, instance của class tự định nghĩa được giữ nguyên, nhưng giá trị trả về là bytes, không phải text (nên khi ghi ra file, mở ở chế độ binary "wb" / "rb").

Đừng bao giờ loads dữ liệu pickle từ người khác

pickle.loads có thể thực thi mã Python tùy ý, nên truyền vào bytes từ nguồn không tin cậy trở thành lỗ hổng thực thi mã tùy ý. Hãy giới hạn ở tình huống "tôi tạo, tôi đọc lại"không bao giờ dùng nó với dữ liệu nhận qua mạng hoặc từ người khác. Để giao tiếp bên ngoài, dùng json thay thế.

HàmVai tròGhi chú
pickle.dumps(obj)object Python → bytestrả về bytes (không phải str)
pickle.loads(b)bytes → object Pythonchỉ với nguồn tin cậy
pickle.dump(obj, file)ghi vào filemở ở chế độ binary open(..., "wb")
pickle.load(file)đọc từ filemở ở chế độ binary open(..., "rb")

Chuyển một dict điểm số thành bytes bằng pickle và kiểm tra kiểu trả về. Bytes của pickle có thể khác độ dài giữa các môi trường, nên ta xác nhận qua type.

① Hãy import module pickle.

② Hãy chuẩn bị dict {"name": "Minh", "scores": [80, 90, 75]} trong biến tên data.

③ Hãy chuyển data thành bytes bằng pickle, lưu vào pickled, và in tên kiểu dưới dạng Kiểu: ◯◯ (kết quả là bytes).

(Nếu chạy đúng, phần giải thích sẽ hiện ra.)

Python Editor

Chạy code để xem đầu ra

Khôi phục pickled bạn đã tạo ở Thực hành 1 trở lại thành object Python và xác nhận nó khớp chính xác với data gốc. Các biến datapickled từ Thực hành 1 vẫn còn dùng được, nên bạn chỉ cần viết bước khôi phục.

④ Hãy khôi phục pickled bằng pickle.loads vào biến tên restored.

⑤ Hãy in Tên khôi phục: ◯◯ (trường name của object đã khôi phục) và Bằng bản gốc: True / False cho phép so sánh bằng.

Python Editor

Chạy code để xem đầu ra

base64 — Đưa dữ liệu binary qua text

base64 là module chuyển dữ liệu binary tùy ý thành chuỗi "chữ số cộng hai ký hiệu". Vì 3 bytes thành 4 ký tự, kích thước tăng khoảng 1.33×, nhưng được dùng rộng rãi trong tình huống cần đưa dữ liệu binary qua kênh chỉ chấp nhận text, như đính kèm email, nhúng ảnh trong JSON hoặc URL, hoặc lưu bytes trong SQL.

Hai API cơ bản:

HàmĐầu vàoTrả về
base64.b64encode(bytes)bytes (dữ liệu nguồn)bytes đã encode Base64
base64.b64decode(Base64)bytes / str (dạng Base64)bytes gốc
Bốn công dụng điển hình của base64
ảnh trong JSON / HTMLdata:image/png;base64,…đính kèm emailcơ chế MIMEJWT token(xác thực web)encode payloadchứng chỉ trong biến môi trườngdữ liệu nhiều dòng trên một dòng
Nhúng ảnh trong JSON / HTML (data URL) / đính kèm email (MIME) / payload của JWT token (JSON Web Token — token xác thực web mang thông tin user kèm phát hiện sửa đổi) / đưa chứng chỉ vào biến môi trường hoặc file cấu hình. Điểm chung là đưa binary qua kênh chỉ chấp nhận text.
Cách base64 hoạt động
dữ liệu binaryb"Python is fun!"b64encodechuỗi Base64UHl0aG9uIGlzIGZ1biE=chuỗi Base64UHl0aG9uIGlzIGZ1biE=b64decodedữ liệu binaryb"Python is fun!"encodedecode
Hàng trên: encode = chiều dữ liệu binary → chuỗi Base64. Hàng dưới: decode = chiều chuỗi Base64 → dữ liệu binary gốc. Bên trong, 3 bytes được tách thành bốn nhóm 6-bit map sang A–Z / a–z / 0–9 / + / / (64 ký tự); số ký tự tăng lên 4/3 ban đầu, với = đệm phần thiếu.
import base64

# bytes → Base64
binary = b"Python is fun!"
encoded = base64.b64encode(binary)
print(encoded)              # b'UHl0aG9uIGlzIGZ1biE='
print(encoded.decode())     # UHl0aG9uIGlzIGZ1biE= (chuyển sang str)

# Base64 → bytes
decoded = base64.b64decode(encoded)
print(decoded)              # b'Python is fun!'
print(decoded == binary)    # True

Cho URL, hãy dùng urlsafe_b64

b64encode chuẩn chứa + và /, nên nhúng trực tiếp vào URL hoặc key JSON cần escape. Cho URL và JSON, hãy chọn base64.urlsafe_b64encode — nó đổi +-/_ để cho biến thể an toàn cho URL. Dùng base64.urlsafe_b64decode để khôi phục.

Encode một chuỗi bytes bằng Base64, decode trở lại, và xác nhận kết quả khớp với bản gốc.

① Hãy import module base64.

② Hãy chuẩn bị chuỗi bytes b"Python is fun!".

③ Đừng in bytes đã encode Base64 dưới dạng bytes — hãy chuyển sang chuỗi ASCII trước rồi in dưới dạng Chuỗi Base64: ◯◯.

④ Hãy decode Base64 trở lại binary gốc và in xem có khớp với bản gốc không dưới dạng Bằng bản gốc: True / False.

Python Editor

Chạy code để xem đầu ra
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Mối nguy của việc gọi pickle.loads trên dữ liệu pickle không tin cậy là gì?

Câu 2Kiểu của giá trị trả về từ pickle.dumps(obj) là gì?

Câu 3Hàm nào tốt nhất khi bạn muốn đặt một chuỗi base64 vào tham số query URL?