CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này là một bài viết về các thao tác tuần tự hóa phổ biến trong Python, được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.
0x00 thống chế 。
Marshal sử dụng nhị phân liên quan đến ngôn ngữ Python nhưng độc lập với máy để đọc và ghi các đối tượng Python. Định dạng nhị phân này cũng liên quan đến phiên bản ngôn ngữ Python. Định dạng tuần tự hóa nguyên soái không tương thích với các phiên bản Python khác nhau.
Marshal thường được sử dụng để tuần tự hóa các đối tượng bên trong python.
Nói chung bao gồm:
- Các loại cơ bản boolean, số nguyên, số dấu phẩy động, số phức
- Bộ sưu tập trình tự các loại chuỗi, byte, bytearray, tuple, danh sách, bộ, Frozenset, từ điển
- đối tượng mã đối tượng mã
- Các loại khác không có, dấu ba chấm, điểm dừng
Chức năng chính của soái ca là hỗ trợ đọc và ghi các tệp .pyc "được biên dịch" python. Đây cũng là lý do khiến marshal không tương thích với các phiên bản python. Các nhà phát triển muốn sử dụng tuần tự hóa/giải tuần tự hóa nên sử dụng mô-đun dưa chua.
Các phương pháp phổ biến.
?
1
|
marshal.dump(giá trị,
tài liệu
[, phiên bản])
|
Tuần tự hóa một đối tượng vào một tập tin.
?
1
|
marshal.dumps(giá trị[, phiên bản])
|
Tuần tự hóa một đối tượng và trả về một đối tượng byte.
Giải tuần tự hóa một đối tượng từ một tập tin.
Giải tuần tự hóa một đối tượng từ dữ liệu nhị phân byte.
0x01 dưa chua 。
Mô-đun dưa chua cũng có thể đọc và ghi các đối tượng Python ở dạng nhị phân. So với marshal cung cấp khả năng xê-ri hóa cơ bản, xê-ri hóa của dưa được sử dụng rộng rãi hơn.
Dữ liệu được tuần tự hóa bởi dưa cũng liên quan đến ngôn ngữ Python, tức là các ngôn ngữ khác như Java không thể đọc dữ liệu nhị phân được tuần tự hóa bởi Python thông qua dưa. Nếu chúng ta muốn sử dụng tính năng tuần tự hóa không có sẵn bằng ngôn ngữ thì chúng ta nên sử dụng json. Điều này sẽ được giải thích dưới đây.
Các kiểu dữ liệu có thể được tuần tự hóa bằng dưa chua là:
- không có, đúng và sai
- số nguyên, số dấu phẩy động, số phức
- chuỗi, byte, mảng byte
- bộ dữ liệu, danh sách, bộ và từ điển và chứa các đối tượng có thể được chọn và tuần tự hóa
- Đối tượng hàm được xác định ở cấp cao nhất của mô-đun (được xác định bằng cách sử dụng def, không phải biểu thức lambda)
- Xác định các hàm dựng sẵn ở cấp cao nhất của mô-đun
- Các lớp được xác định ở cấp cao nhất của lược đồ
- __dict__ của một lớp chứa các đối tượng có thể tuần tự hóa hoặc phương thức __getstate__() trả về một đối tượng có thể được tuần tự hóa
Lỗi tẩy sẽ xuất hiện nếu tẩy một đối tượng không hỗ trợ tuần tự hóa.
Các phương pháp phổ biến.
?
1
|
pickle.dump(obj,
tài liệu
, giao thức
=
không có,
*
, sửa_lỗi
=
ĐÚNG VẬY)
|
Tuần tự hóa đối tượng obj thành một tệp tệp. Phương thức này tương đương với pickler(file, Protocol).dump(obj).
?
1
|
pickle.dumps(obj, giao thức
=
không có,
*
, sửa_lỗi
=
ĐÚNG VẬY)
|
Tuần tự hóa đối tượng obj thành dữ liệu nhị phân byte.
?
1
|
dưa chua.tải(
tài liệu
,
*
, sửa_lỗi
=
đúng, mã hóa
=
"ascii"
, lỗi
=
"nghiêm ngặt"
)
|
Giải tuần tự hóa một đối tượng từ một tệp tệp. Phương pháp này tương đương với unpickler(file).load().
?
1
|
pickle.loads(đối tượng_byte,
*
, sửa_lỗi
=
đúng, mã hóa
=
"ascii"
, lỗi
=
"nghiêm ngặt"
)
|
Giải tuần tự hóa một đối tượng từ dữ liệu nhị phân bytes_object.
Ví dụ tuần tự hóa.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
nhập khẩu
dưa chua
dữ liệu
=
{
'Một'
: [
1
,
2.0
,
3
,
4
+
6j
],
'b'
: (
"chuỗi ký tự"
, b
"chuỗi byte"
),
'c'
: {không có, đúng, sai}
}
với
mở
(
'dữ liệu.pickle'
,
'wb'
) như f:
pickle.dump(dữ liệu, f, pickle.highest_protocol)
|
Sau khi thực hiện sẽ có thêm file data.pickle trong thư mục.
tuần tự hóa ├── data.pickle ├── pickles.py └── unpickles.py 。
Ví dụ về khử lưu huỳnh
?
1
2
3
4
5
6
7
8
9
10
11
12
|
nhập khẩu
dưa chua
với
mở
(
'dữ liệu.pickle'
,
'rb'
) như f:
dữ liệu
=
pickle.load(f)
in
(dữ liệu)
|
0x02 json json là định dạng tương tác dữ liệu độc lập với ngôn ngữ và rất phổ biến. Trong python nó có API tương tự như marshal và dưa chua.
Các phương pháp phổ biến.
?
1
|
json.dump(obj, fp,
*
, bỏ qua phím
=
sai, đảm bảo_ascii
=
đúng, kiểm tra_tuần hoàn
=
đúng, allow_nan
=
ĐÚNG VẬY,
lớp
=
không có, thụt lề
=
không có, bộ tách
=
không có, mặc định
=
không có, sort_keys
=
SAI,
*
*
(kw)
|
Tuần tự hóa các đối tượng thành các tập tin fp.
?
1
|
json.dumps(obj,
*
, bỏ qua phím
=
sai, đảm bảo_ascii
=
đúng, kiểm tra_tuần hoàn
=
đúng, allow_nan
=
ĐÚNG VẬY,
lớp
=
không có, thụt lề
=
không có, bộ tách
=
không có, mặc định
=
không có, sort_keys
=
SAI,
*
*
(kw)
|
Tuần tự hóa obj thành đối tượng json.
?
1
|
json.load(fp,
*
,
lớp
=
không có, object_hook
=
không có, parse_float
=
không có, parse_int
=
không có, parse_constant
=
không có, object_pairs_hook
=
không có,
*
*
(kw)
|
Giải tuần tự hóa từ tập tin thành một đối tượng.
?
1
|
json.loads(s,
*
, mã hóa
=
không có,
lớp
=
không có, object_hook
=
không có, parse_float
=
không có, parse_int
=
không có, parse_constant
=
không có, object_pairs_hook
=
không có,
*
*
(kw)
|
Giải tuần tự hóa từ tài liệu định dạng json thành một đối tượng.
Bảng chuyển đổi giữa các đối tượng json và python.
json |
trăn |
sự vật |
từ điển |
danh sách, bộ |
mảng |
đường |
sợi dây |
int, float, enum bắt nguồn từ int và float |
con số |
ĐÚNG VẬY |
ĐÚNG VẬY |
SAI |
SAI |
không có |
vô giá trị |
Công việc tuần tự hóa có thể được hoàn thành rất tốt đối với các kiểu cơ bản, trình tự và kiểu bộ sưu tập json chứa các kiểu cơ bản.
Ví dụ tuần tự hóa.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
>>>
nhập khẩu
json
>>> json.dumps([
'đồ ngốc'
, {
'thanh'
: (
'căn cứ'
, không có,
1.0
,
2
)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>>
in
(json.dumps(
"\"foo\bar"
))
"\"foo\bar"
>>>
in
(json.dumps(
'\u1234'
))
"\u1234"
>>>
in
(json.dumps(
'\\'
))
"\\"
>>>
in
(json.dumps({
"c"
:
0
,
"b"
:
0
,
"Một"
:
0
}, sắp xếp các khóa
=
ĐÚNG VẬY))
{
"Một"
:
0
,
"b"
:
0
,
"c"
:
0
}
>>>
từ
cái này
nhập khẩu
dây đàn
>>> tôi
=
chuỗi()
>>> json.dump([
'api phát trực tuyến'
], cái này)
>>> io.getvalue()
'["api phát trực tuyến"]'
|
Ví dụ về khử lưu huỳnh
?
1
2
3
4
5
6
7
8
9
|
>>>
nhập khẩu
json
>>> json.loads(
'["foo", {"bar":["baz", null, 1.0, 2]}]'
)
[
'đồ ngốc'
, {
'thanh'
: [
'căn cứ'
, không có,
1.0
,
2
]}]
>>> json.loads(
'"\\"foo\\bar"'
)
'"foo\x08ar'
>>>
từ
cái này
nhập khẩu
dây đàn
>>> tôi
=
chuỗi(
'["api phát trực tuyến"]'
)
>>> json.load(io)
[
'api phát trực tuyến'
]
|
Đối với các đối tượng, tình hình phức tạp hơn.
Ví dụ: một tài liệu json xác định một đối tượng phức tạp.
complex_data.json 。
?
1
2
3
4
5
|
{
"__tổ hợp__"
: ĐÚNG VẬY,
"thực tế"
:
42
,
"tưởng tượng"
:
36
}
|
Để giải tuần tự hóa tài liệu json này thành đối tượng python, bạn cần xác định phương thức chuyển đổi.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
nhập khẩu
json
định nghĩa
giải mã_phức tạp(dct):
nếu như
"__tổ hợp__"
TRONG
lệnh:
trở lại
tổ hợp
(dct[
"thực tế"
], dct[
"tưởng tượng"
])
khác
:
trở lại
dct
nếu như
__tên__
=
=
'__chủ yếu__'
:
với
mở
(
"complex_data.json"
) dưới dạng complex_data:
Với
=
json.load(dữ liệu phức tạp, móc đối tượng
=
giải mã_phức tạp)
in
(
kiểu
(Với))
in
(Với)
|
Nếu object_hook không được chỉ định, đối tượng trong tài liệu json sẽ được chuyển đổi thành dict theo mặc định.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
nhập khẩu
json
nếu như
__tên__
=
=
'__chủ yếu__'
:
với
mở
(
"complex_data.json"
) dưới dạng complex_data:
z2
=
json.loads(dữ liệu phức tạp.đọc())
in
(
kiểu
(z2))
in
(z2)
|
Bạn có thể thấy đối tượng trong tài liệu json được chuyển đổi thành đối tượng dict.
Trong trường hợp bình thường, dường như không có vấn đề gì khi sử dụng theo cách này, nhưng trong các tình huống có yêu cầu loại cao, phương thức chuyển đổi cần phải được xác định rõ ràng.
Ngoài tham số object_hook, json.jsonencoding cũng có thể được sử dụng.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
nhập khẩu
json
lớp học
bộ mã hóa phức tạp (json.jsonencoder):
định nghĩa
mặc định(
bản thân
, đối tượng):
nếu như
là trường hợp
(đối tượng,
tổ hợp
):
trở lại
[đối tượng thực, đối tượng hình ảnh]
trở lại
json.jsonencoder.mặc định(
bản thân
, đối tượng)
nếu như
__tên__
=
=
'__chủ yếu__'
:
c
=
json.dumps(
2
+
1 giây
,
lớp
=
bộ mã hóa phức hợp)
in
(
kiểu
(c))
in
(c)
|
Vì mô-đun json không thể tự động tuần tự hóa tất cả các loại nên lỗi kiểu sẽ được đưa ra trực tiếp đối với các loại không được hỗ trợ.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
>>>
nhập khẩu
ngày giờ
>>> ngày
=
datetime.datetime.now()
>>> dct
=
{
'sinh nhật'
:d,
'chất lỏng'
:
124
,
'tên'
:
'jack'
}
>>> dct
{
'sinh nhật'
: datetime.datetime(
2019
,
6
,
14
,
11
,
16
,
17
,
434361
),
'chất lỏng'
:
124
,
'tên'
:
'jack'
}
>>> json.dumps(dct)
traceback (cuộc gọi gần đây nhất cuối cùng):
tài liệu
""
, đường kẻ
1
,
TRONG
json.dumps(dct)
tài liệu
"/library/frameworks/python.framework/versions/3.7/lib/python3.7/json/__init__.py"
, đường kẻ
231
,
TRONG
bãi rác
trở lại
_default_encoder.encode(obj)
tài liệu
"/library/frameworks/python.framework/versions/3.7/lib/python3.7/json/encoding.py"
, đường kẻ
199
,
TRONG
mã hóa
những khối
=
bản thân
.iterencode(o, _one_shot
=
ĐÚNG VẬY)
tài liệu
"/library/frameworks/python.framework/versions/3.7/lib/python3.7/json/encoding.py"
, đường kẻ
257
,
TRONG
mã hóa lặp lại
trở lại
_iterencode(o,
0
)
tài liệu
"/library/frameworks/python.framework/versions/3.7/lib/python3.7/json/encoding.py"
, đường kẻ
179
,
TRONG
mặc định
nâng lên
lỗi đánh máy(f
'đối tượng của loại {o.__class__.__name__} '
lỗi đánh máy:
sự vật
của
kiểu
ngày giờ
là
không
json có thể tuần tự hóa
|
Đối với các loại không hỗ trợ tuần tự hóa, chẳng hạn như loại ngày giờ và loại tùy chỉnh, bạn cần sử dụng jsonencoding để xác định logic chuyển đổi.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
nhập khẩu
json
nhập khẩu
ngày giờ
lớp học
bộ mã hóa thời gian(json.jsonencoder):
định nghĩa
mặc định(
bản thân
, đối tượng):
nếu như
là trường hợp
(đối tượng, datetime.datetime):
trở lại
obj. strftime(
'%y-%m-%d %h:%m:%s'
)
Elif
là trường hợp
(đối tượng, datetime.ngày):
trở lại
obj. strftime(
'%y-%m-%d'
)
khác
:
trở lại
json.jsonencoder.mặc định(
bản thân
, đối tượng)
nếu như
__tên__
=
=
'__chủ yếu__'
:
ngày
=
datetime.date.today()
dct
=
{
"sinh nhật"
:d,
"tên"
:
"Jack"
}
dữ liệu
=
json.dumps(dct,
lớp
=
bộ mã hóa ngày giờ)
in
(dữ liệu)
|
Bây giờ chúng tôi hy vọng chuyển đổi định dạng ngày trong tài liệu json thành đối tượng datetime.date khi tuần tự hóa. Trong trường hợp này, chúng tôi cần sử dụng json.jsondecoding.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
nhập khẩu
json
nhập khẩu
ngày giờ
lớp học
bộ giải mã ngày giờ (json.jsondecoder):
định nghĩa
__nóng__(
bản thân
):
siêu
().__init__(móc_đối_tượng
=
bản thân
.dict2obj)
định nghĩa
dict2obj(
bản thân
, d):
nếu như
là trường hợp
(ngày,
từ điển
):
vì
tôi
TRONG
ngày:
nếu như
là trường hợp
(d[k],
đường
):
cái đó
=
d[k].split(
"-"
)
nếu như
chỉ một
(cái đó)
=
=
3
:
ngày
=
ngày giờ.ngày(
số nguyên
(cái đó[
0
]),
số nguyên
(cái đó[
1
]),
số nguyên
(cái đó[
2
]))
d[k]
=
ngày
trở lại
ngày
nếu như
__tên__
=
=
'__chủ yếu__'
:
ngày
=
datetime.date.today()
dct
=
{
"sinh nhật"
:d,
"tên"
:
"Jack"
}
dữ liệu
=
json.dumps(dct,
lớp
=
bộ mã hóa ngày giờ)
đối tượng
=
json.loads(dữ liệu,
lớp
=
bộ giải mã ngày giờ)
in
(
kiểu
(đối tượng))
in
(đối tượng)
|
0x03 Để tóm tắt.
Các công cụ tuần tự hóa phổ biến trong python bao gồm marshal, dưa chua và json. Marshal chủ yếu được sử dụng cho các tệp .pyc của Python và có liên quan đến phiên bản Python. Nó không thể tuần tự hóa các lớp do người dùng định nghĩa.
Pickle là một công cụ tuần tự hóa cho các đối tượng python và linh hoạt hơn so với marshal. Nó tương thích với các phiên bản khác nhau của python. JSON là cấu trúc dữ liệu độc lập với ngôn ngữ, được sử dụng rộng rãi để tương tác dữ liệu trong các ứng dụng mạng khác nhau, đặc biệt là trong các dịch vụ API REST.
0x04 Tài liệu học tập.
- docs.python.org/3/library/m…
- docs.python.org/3/library/p…
- docs.python.org/3/library/j…
Được rồi, đó là toàn bộ nội dung của bài viết này, tôi hy vọng nội dung của bài viết này có giá trị tham khảo và học tập nhất định cho việc học tập hoặc làm việc của mọi người.
Link gốc: https://juejin.im/post/5d0362755188255e780b6815.
Cuối cùng, bài viết về các thao tác tuần tự hóa phổ biến trong Python có ở đây. Nếu bạn muốn biết thêm về một bài viết về các thao tác tuần tự hóa phổ biến trong Python, vui lòng tìm kiếm bài viết CFSDN hoặc duyệt các bài viết liên quan. blog trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!