plistlib — Apple plist 파일 생성 및 분석

plistlib — Apple plist 파일 생성 및 분석

소스 코드: Lib/plistlib.py

이 모듈은 주로 macOS와 iOS에서 Apple이 사용하는 "property list" 파일을 읽고 쓰는 인터페이스를 제공해요. 이 모듈은 이진(binary) plist 파일과 XML plist 파일을 모두 지원해요.

property list(.plist) 파일 형식은 사전, 리스트, 숫자, 문자열 같은 기본 객체 타입을 지원하는 단순한 직렬화 방식이에요. 보통 최상위 객체는 사전이에요.

plist 파일을 쓰고 분석하려면 dump()load() 함수를 사용해요. plist 데이터를 바이트나 문자열 객체로 다루려면 dumps()loads()를 사용해요.

값으로는 문자열, 정수, 부동소수점, 불리언, 튜플, 리스트, 사전(문자열 키만), bytes, bytearray 또는 datetime.datetime 객체를 쓸 수 있어요.

버전 3.4에서 변경: 새 API 추가, 옛 API 폐기, 이진 형식 plist 지원 추가.

버전 3.8에서 변경: NSKeyedArchiverNSKeyedUnarchiver가 사용하는 이진 plist의 UID 토큰 읽기·쓰기 지원 추가.

버전 3.9에서 변경: 옛 API 제거.

출처: Python 표준 라이브러리

본문

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

plist 파일을 읽어요. fp는 읽기 가능한 이진 파일 객체여야 해요. 언팩된 루트 객체(보통 사전)를 돌려줘요.

fmt는 파일의 형식으로, 다음 값이 유효해요.

  • None — 파일 형식을 자동 감지.
  • FMT_XML — XML 파일 형식.
  • FMT_BINARY — 이진 plist 형식.

dict_type은 plist 파일에서 읽은 사전에 사용되는 타입이에요. aware_datetime이 참이면 datetime.datetime 타입의 필드가 tzinfodatetime.UTC로 하는 aware 객체로 만들어져요.

FMT_XML 형식의 XML 데이터는 xml.parsers.expat의 Expat 파서로 분석돼요. 잘못된 형식의 XML에 대한 가능한 예외는 해당 문서를 참고하세요. 알 수 없는 요소는 plist 파서가 그냥 무시해요. 파일을 분석할 수 없으면 파서는 InvalidFileException을 발생시켜요.

버전 3.4에 추가.

버전 3.13에서 변경: 키워드 전용 매개변수 aware_datetime 추가.

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

바이트 또는 문자열 객체에서 plist를 로드해요. 키워드 인자의 설명은 load()를 참고하세요.

버전 3.4에 추가.

버전 3.13에서 변경: fmtFMT_XML일 때 data가 문자열일 수 있음.

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

value를 plist 파일에 써요. fp는 쓰기 가능한 이진 파일 객체여야 해요.

fmt 인자는 plist 파일의 형식을 지정하며 다음 값 중 하나일 수 있어요.

  • FMT_XML — XML 형식의 plist 파일.
  • FMT_BINARY — 이진 형식의 plist 파일.

sort_keys가 참(기본)이면 사전의 키를 정렬 순서로 쓰고, 그렇지 않으면 사전의 반복 순서로 써요. skipkeys가 거짓(기본)이면 사전의 키가 문자열이 아닐 때 TypeError를 발생시키고, 참이면 그런 키는 건너뛰어요. aware_datetime이 참이고 datetime.datetime 타입 필드가 aware 객체로 설정되어 있으면 쓰기 전에 UTC 시간대로 변환해요.

객체가 지원되지 않는 타입이거나 지원되지 않는 타입의 객체를 담은 컨테이너면 TypeError가 발생해요. (이진) plist 파일로 표현할 수 없는 정수 값에는 OverflowError가 발생해요.

버전 3.4에 추가.

버전 3.13에서 변경: 키워드 전용 매개변수 aware_datetime 추가.

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

value를 plist 형식의 bytes 객체로 돌려줘요. 키워드 인자의 설명은 dump() 문서를 참고하세요.

버전 3.4에 추가.

클래스

class plistlib.UID(data)

int를 감싸는(wrap) 클래스예요. UID를 담는 NSKeyedArchiver 인코딩 데이터를 읽거나 쓸 때 사용돼요(PList 매뉴얼 참고).

  • data — UID의 int 값. 범위는 0 <= data < 2**64여야 해요. (버전 3.8에 추가.)

상수

  • plistlib.FMT_XML — plist 파일의 XML 형식. (버전 3.4에 추가.)
  • plistlib.FMT_BINARY — plist 파일의 이진 형식. (버전 3.4에 추가.)

예외

exception plistlib.InvalidFileException

파일을 분석할 수 없을 때 발생해요.

버전 3.4에 추가.

예제 (Examples)

plist 생성하기:

import datetime as dt
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 = dt.datetime.now()
)
print(plistlib.dumps(pl).decode())

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"])

더 알아보기