plistlib — Generate and parse Apple .plist files

Código-fonte: Lib/plistlib.py


Este módulo fornece uma interface para ler e escrever os arquivos “property listas (lista de propriedades) usados ​​pela Apple, principalmente no macOS e iOS. Este módulo tem suporte a arquivos plist binários e XML.

O formato de arquivo de lista de propriedades (.plist) é uma serialização simples que oferece suporte a tipos básicos de objetos, como dicionários, listas, números e strings. Normalmente, o objeto de nível superior é um dicionário.

Para escrever e analisar um arquivo plist, use as funções dump() e load().

Para trabalhar com dados plist em objetos bytes, use dumps() e loads().

Os valores podem ser strings, inteiros, floats, booleanos, tuplas, listas, dicionários (mas somente com chaves de string), objetos bytes, bytearray ou datetime.datetime.

Alterado na versão 3.4: Nova API, API antiga descontinuada. Suporte para plists de formato binário adicionado.

Alterado na versão 3.8: Adicionado suporte para leitura e escrita de tokens UID em plists binários, conforme usado por NSKeyedArchiver e NSKeyedUnarchiver.

Alterado na versão 3.9: API antiga removida.

Ver também

PList manual page

Documentação da Apple sobre o formato de arquivo.

Este módulo define as seguintes funções:

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

Lê um arquivo plist. fp deve ser um objeto arquivo binário e legível. Retorna o objeto raiz desempacotado (que geralmente é um dicionário).

fmt é o formato do arquivo e os seguintes valores são válidos:

  • None: Detecta automaticamente o formato do arquivo

  • FMT_XML: Formato de arquivo XML

  • FMT_BINARY: Formato binário plist

O dict_type é o tipo usado para dicionários que são lidos do arquivo plist.

Dados XML para o formato FMT_XML são analisados ​​usando o analisador sintático Expat de xml.parsers.expat – veja sua documentação para possíveis exceções em XML malformado. Elementos desconhecidos serão simplesmente ignorados pelo analisador de plist.

O analisador sintático para o formato binário levanta InvalidFileException quando o arquivo não pode ser analisado.

Novo na versão 3.4.

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

Carrega um plist de um objeto bytes. Veja load() para uma explicação dos argumentos nomeados.

Novo na versão 3.4.

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

Escreve value em um arquivo plist. Fp deve ser um objeto arquivo binário gravável.

O argumento fmt especifica o formato do arquivo plist e pode ser um dos seguintes valores:

  • FMT_XML: Arquivo plist formatado em XML

  • FMT_BINARY: Arquivo plist formatado em binário

Quando sort_keys é verdadeiro (o padrão), as chaves dos dicionários serão escritas ordenadas no plist, caso contrário, elas serão escritas na ordem de iteração do dicionário.

Quando skipkeys é falso (o padrão), a função levanta TypeError quando uma chave de um dicionário não é uma string, caso contrário, tais chaves são ignoradas.

Uma TypeError será levantada se o objeto for de um tipo não suportado ou um contêiner que contém objetos de tipos não suportados.

Uma OverflowError será levantada para valores inteiros que não podem ser representados em arquivos plist (binários).

Novo na versão 3.4.

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

Retorna value como um objeto bytes formatado em plist. Veja a documentação para dump() para uma explicação dos argumentos nomeados desta função.

Novo na versão 3.4.

As seguintes classes estão disponíveis:

class plistlib.UID(data)

Envolve um int. Isso é usado ao ler ou escrever dados codificados NSKeyedArchiver, que contém UID (veja o manual de PList).

Tem um atributo, data, que pode ser usado para recuperar o valor int do UID. data deve estar no intervalo 0 <= data < 2**64.

Novo na versão 3.8.

As seguintes constantes estão disponíveis:

plistlib.FMT_XML

O formato XML para arquivos plist.

Novo na versão 3.4.

plistlib.FMT_BINARY

O formato binário para arquivos plist

Novo na versão 3.4.

Exemplos

Gerando um plist:

import datetime
import plistlib

pl = dict(
    aString = "Doodah",
    aList = ["A", "B", 12, 32.1, [1, 2, 3]],
    aFloat = 0.1,
    anInt = 728,
    aDict = dict(
        anotherString = "<hello & hi there!>",
        aThirdString = "M\xe4ssig, Ma\xdf",
        aTrueValue = True,
        aFalseValue = False,
    ),
    someData = b"<binary gunk>",
    someMoreData = b"<lots of binary gunk>" * 10,
    aDate = datetime.datetime.now()
)
print(plistlib.dumps(pl).decode())

Analisando um plist:

import plistlib

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