sách gpt4 ăn đã đi

Bài viết tìm hiểu về các thao tác tuần tự hóa phổ biến trong Python

In lại Tác giả: qq735679552 Thời gian cập nhật: 28-09-2022 22:32:09 26 4
mua khóa gpt4 giày nike

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.

?
1
marshal. tải( tài liệu )

Giải tuần tự hóa một đối tượng từ một tập tin.

?
1
marshal.loads(byte)

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
 
# Định nghĩa một từ điển chứa các đối tượng có thể được tuần tự hóa
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:
  # Tuần tự hóa đối tượng thành file data.pickle
  #Chỉ định phiên bản của Pickle.highest_protocol ở định dạng tuần tự hóa
  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:
  #Deserialize các đối tượng từ tệp data.pickle
  # dưa chua có thể tự động phát hiện phiên bản của tệp được tuần tự hóa
  # Vì vậy bạn không cần số phiên bản ở đây
  dữ liệu = pickle.load(f)
 
  in (dữ liệu)
 
# Kết quả sau khi thực hiện
# {'a': [1, 2.0, 3, (4+6j)], 'b': ('chuỗi ký tự', b'chuỗi byte'), 'c': {false, true, none}}

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
# mã hóa=utf-8
nhập khẩu json
 
# Xác định hàm chuyển đổi để chuyển đổi nội dung trong json thành đối tượng phức tạp
đị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:
   # object_hook chỉ định chức năng chuyển đổi
   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)
 
#Kết quả thực hiện
#
# (42+36j)

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
# mã hóa=utf-8
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:
   #Object_hook không được chỉ định ở đây
   z2 = json.loads(dữ liệu phức tạp.đọc())
   in ( kiểu (z2))
   in (z2)
#Kết quả thực hiện
#
# {'__complex__': đúng, 'thực': 42, 'ảo': 36}

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 ):
    # Nếu đối tượng phức tạp được chuyển đổi thành một mảng,
    trở lại [đối tượng thực, đối tượng hình ảnh]
    #Xử lý mặc đị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)
 
#Kết quả thực hiện
#
# [2.0, 1.0]

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ờ 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ờ
 
# Xác định jsonencoding kiểu ngày tháng
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)
 
#Kết quả thực hiện
# {"sinh nhật": "2019-06-14", "tên": "jack"}

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
# mã hóa=utf-8
nhập khẩu json
nhập khẩu ngày giờ
 
#Define bộ giải mã để phân tích cú pháp json
lớp học bộ giải mã ngày giờ (json.jsondecoder):
 
  #Phương pháp thi công
  đị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 ):
    tôi TRONG ngày:
     nếu như là trường hợp (d[k], đường ):
      # Phân tích định dạng ngày và tạo đối tượng ngày
      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ờ)
  # in(dữ liệu)
 
  đố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)
 
#Kết quả thực hiện
# {"sinh nhật": "2019-06-14", "tên": "jack"}
#
# {'sinh nhật': datetime.date(2019, 6, 14), 'tên': 'jack'}

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! .

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress