plistlib --- Tạo và phân tích các tệp Apple .plist

Source code: Lib/plistlib.py


Mô-đun này cung cấp giao diện để đọc và ghi các tệp "danh sách thuộc tính" được Apple sử dụng, chủ yếu trên macOS và iOS. Mô-đun này hỗ trợ cả tệp plist nhị phân và XML.

Định dạng tệp danh sách thuộc tính (.plist) là một chuỗi tuần tự hóa đơn giản hỗ trợ các loại đối tượng cơ bản, như từ điển, danh sách, số và chuỗi. Thông thường đối tượng cấp cao nhất là từ điển.

Để viết ra và phân tích một tệp plist, hãy sử dụng các hàm dump()load().

Để làm việc với dữ liệu plist theo byte hoặc đối tượng chuỗi, hãy sử dụng dumps()loads().

Các giá trị có thể là chuỗi, số nguyên, số float, boolean, bộ dữ liệu, danh sách, từ điển (nhưng chỉ với các khóa chuỗi), các đối tượng bytes, bytearray hoặc datetime.datetime.

Thay đổi trong phiên bản 3.4: API mới, API cũ không được dùng nữa. Đã thêm hỗ trợ cho các định dạng nhị phân.

Thay đổi trong phiên bản 3.8: Đã thêm hỗ trợ để đọc và ghi mã thông báo UID ở dạng nhị phân được NSKeyedArchiver và NSKeyedUnarchiver sử dụng.

Thay đổi trong phiên bản 3.9: Zz000zz cũ đã bị xóa.

Xem thêm

PList manual page

Tài liệu của Apple về định dạng tệp.

Mô-đun này xác định các chức năng sau:

plistlib.load(fp, *, fmt=None, dict_type=dict, aware_datetime=False)

Đọc một tập tin plist. fp phải là một đối tượng tệp nhị phân và có thể đọc được. Trả về đối tượng gốc đã được giải nén (thường là từ điển).

Zz000zz là định dạng của tệp và các giá trị sau là hợp lệ:

  • None: Tự động phát hiện định dạng file

  • FMT_XML: định dạng tệp XML

  • FMT_BINARY: Định dạng số nhị phân

Zz000zz là loại được sử dụng cho các từ điển được đọc từ tệp plist.

Khi aware_datetime là đúng, các trường có loại datetime.datetime sẽ được tạo là aware object, với tzinfodatetime.UTC.

Dữ liệu XML cho định dạng FMT_XML được phân tích cú pháp bằng trình phân tích cú pháp Expat từ xml.parsers.expat -- xem tài liệu của nó để biết các trường hợp ngoại lệ có thể xảy ra đối với XML không đúng định dạng. Các phần tử không xác định sẽ bị trình phân tích cú pháp plist bỏ qua.

Trình phân tích cú pháp tăng InvalidFileException khi không thể phân tích cú pháp tệp.

Added in version 3.4.

Thay đổi trong phiên bản 3.13: Thông số chỉ từ khóa aware_datetime đã được thêm vào.

plistlib.loads(data, *, fmt=None, dict_type=dict, aware_datetime=False)

Tải một số nguyên từ một đối tượng byte hoặc chuỗi. Xem load() để biết giải thích về các đối số từ khóa.

Added in version 3.4.

Thay đổi trong phiên bản 3.13: data có thể là một chuỗi khi fmt bằng FMT_XML.

plistlib.dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False)

Viết value vào một tập tin plist. fp phải là một đối tượng tệp nhị phân có thể ghi.

Đối số fmt chỉ định định dạng của tệp plist và có thể là một trong các giá trị sau:

  • FMT_XML: tệp plist được định dạng XML

  • FMT_BINARY: Tệp plist có định dạng nhị phân

Khi sort_keys là true (mặc định), các khóa của từ điển sẽ được ghi vào plist theo thứ tự được sắp xếp, nếu không chúng sẽ được viết theo thứ tự lặp lại của từ điển.

Khi skipkeys sai (mặc định), hàm sẽ tăng TypeError khi khóa của từ điển không phải là chuỗi, nếu không các khóa đó sẽ bị bỏ qua.

Khi aware_datetime là đúng và bất kỳ trường nào có loại datetime.datetime được đặt là aware object, nó sẽ chuyển đổi sang múi giờ UTC trước khi ghi.

Một TypeError sẽ được nâng lên nếu đối tượng thuộc loại không được hỗ trợ hoặc vùng chứa chứa các đối tượng thuộc loại không được hỗ trợ.

Một OverflowError sẽ được nâng lên cho các giá trị số nguyên không thể được biểu diễn trong tệp plist (nhị phân).

Added in version 3.4.

Thay đổi trong phiên bản 3.13: Thông số chỉ từ khóa aware_datetime đã được thêm vào.

plistlib.dumps(value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False)

Trả về value dưới dạng đối tượng byte có định dạng plist. Xem tài liệu về dump() để biết giải thích về các đối số từ khóa của hàm này.

Added in version 3.4.

Các lớp sau đây có sẵn:

class plistlib.UID(data)

Kết thúc một int. Điều này được sử dụng khi đọc hoặc ghi dữ liệu được mã hóa NSKeyedArchiver, chứa UID (xem hướng dẫn sử dụng PList).

data

Giá trị int của UID. Nó phải nằm trong phạm vi 0 <= data < 2**64.

Added in version 3.8.

Các hằng số sau đây có sẵn:

plistlib.FMT_XML

Định dạng XML cho tệp plist.

Added in version 3.4.

plistlib.FMT_BINARY

Định dạng nhị phân cho tệp plist

Added in version 3.4.

Mô-đun xác định các ngoại lệ sau:

exception plistlib.InvalidFileException

Xảy ra khi không thể phân tích cú pháp một tệp.

Added in version 3.4.

Ví dụ

Tạo một số nguyên:

nhập ngày giờ dưới dạng dt
nhập plistlib

pl = dict(
    aString = "Chết tiệt",
    aList = ["A", "B", 12, 32.1, [1, 2, 3]],
    aFloat = 0,1,
    anInt = 728,
    aDict = dict(
        anotherString = "<xin chào & xin chào!>",
        aThirdString = "M\xe4ssig, Ma\xdf",
        aTrueValue = Đúng,
        aFalseValue = Sai,
    ),
    someData = b"<nhị phân>",
    someMoreData = b"<rất nhiều rác nhị phân>" * 10,
    aDate = dt.datetime.now()
)
print(plistlib.dumps(pl).decode())

Phân tích một số nguyên:

nhập plistlib

plist = b"""<plist version="1.0">
<dict>
    <key>foo</key>
    <string>thanh</string>
</dict>
</plist>"""
pl = plistlib.loads(plist)
print(pl["foo"])