고급 파이썬 개발 과정
챕터
>
레벨

직렬화 모듈
마샬 및 피클 모듈

목표

서비스 스테이션으로 이동하여 JSON 모듈을 사용해 파일을 포맷함으로써 데이터가 올바르게 저장되었는지 확인하세요.

경로를 따라 계속 진행하면, 미래 수확을 위해 개발 중인 토지의 수자원 배분과 토양 품질을 모니터링하는 몇몇 스테이션을 발견합니다. 데이터를 처리하기 위해 데이터를 직렬화하는 것이 효율적입니다. JSON을 일반적인 해결책으로 사용하는 것도 효과적일 수 있지만, Python에 특화된 몇 가지 직렬화 방법도 있습니다. 이들은 Marshal과 Pickle 모듈입니다. Marshal 모듈은 데이터를 이진 형식으로 변환하여 빠른 직렬화/역직렬화를 위해 설계되었으며, 보다 간단한 데이터 전송에 적합합니다. Pickle 모듈은 상대적으로 느리지만, 더 복잡한 데이터 구조를 처리할 수 있도록 설계되었으며 훨씬 더 유연하여, 더 크거나 우선순위가 높은 데이터 구조에 이상적입니다.

Marshal 및 Pickle 모듈을 사용하려면, 다음과 같이 함수를 가져오세요: import marshal 그리고 import pickle. 우리 목적을 위해, 다음의 함수들을 사용할 것입니다:

  • marshal.dumps(): Python 내에서 속도를 고려하여 설계된 이진 형식으로 데이터를 직렬화합니다. 하나의 인자, 즉 직렬화할 데이터를 받으며, 기본 데이터 타입에 한정됩니다.
  • marshal.loads(): 이진 데이터를 Python에서 읽을 수 있는 데이터 타입으로 역직렬화합니다. 기능에는 제한이 있지만 빠르게 실행되며, 역직렬화할 데이터를 인자로 받습니다.
  • pickle.DEFAULT_PROTOCOL: 현재 사용 중인 Python 버전에서 Pickle 직렬화의 기본 프로토콜 버전을 확인합니다. 이 프로토콜은 데이터가 직렬화되는 방식에 영향을 미칩니다.
  • pickle.HIGHEST_PROTOCOL: 현재 Python 버전에서 사용 가능한 Pickle 직렬화의 가장 높은 프로토콜 버전을 확인합니다. 이 프로토콜은 데이터가 직렬화되는 방식에 영향을 미칩니다.
  • pickle.dumps(): 사용된 프로토콜에 따라 복잡한 Python 데이터 구조를 이진 형식으로 직렬화합니다. 두 개의 인자, 즉 직렬화할 데이터와 사용할 프로토콜 버전을 받습니다.
  • pickle.loads(): Python 객체에 대해 강력한 범위로 이진 데이터를 Python에서 읽을 수 있는 데이터 타입으로 역직렬화합니다. 역직렬화할 데이터를 인자로 받습니다.

이 모듈과 함수들 외에도, 데이터를 명확하게 표시할 수 있도록 사전(dictionary) 등과 같은 데이터 구조를 포맷하는 데 사용할 수 있는 함수인 pformat()을 제공하는 포매팅 모듈 pformat을 사용할 것입니다. 이를 위해 from pprint import pformat 구문을 사용해 가져옵니다.

시작하려면 작은 모니터링 스테이션 안의 빛나는 X 표시로 걸어가서 컴퓨터 터미널을 응시하세요. 이 스테이션은 작물 재배를 위해 개발 중인 인근 지형의 수압과 토양 상태를 모니터링합니다. 스테이션에서 수집한 Python 데이터가 포함된 reading 이라는 상수가 있습니다.

변수 data를 생성하고, marshal.dumps() 함수에 reading을 인자로 전달하여 반환된 값을 저장하세요. 아래와 같이: data = marshal.dumps(reading). 미리 작성된 display() 함수를 사용하여 직렬화된 변수 데이터를 확인하기 위해 data 변수를 사용합니다.

스테이션을 나와 금색 X 표시로 이동한 다음, open() 함수를 사용하여 문을 열고 사무실에 입장하세요. 터미널 앞의 빛나는 X 표시로 걸어가서 방금 직렬화한 데이터를 역직렬화합니다. 변수 output을 생성하고, 이전의 data 변수를 인자로 하여 marshal.loads() 함수의 반환값을 저장하세요. 미리 작성된 write() 함수에 output을 인자로 전달하여 모니터링 스테이션에서 수집한 직렬화된 데이터에 접근합니다.

사무실에 있는 파란 카펫 위의 빛나는 X 표시로 걸어가 터미널에서 데이터를 처리할 때 Pickle 모듈이 사용할 직렬화 유형을 결정하기 위해 프로토콜을 확인합니다. 미리 작성된 write() 함수의 인자로 pickle.DEFAULT_PROTOCOLpickle.HIGHEST_PROTOCOL을 설정하세요. 이를 통해 현재 사용 중인 직렬화 프로토콜과 최신 직렬화 프로토콜을 확인할 수 있습니다.

파란 카펫 위에 있는 어두운 X 표로 이동하세요. 모든 프로토콜이 확인된 후, 저장된 데이터를 검증할 수 있습니다. 수개월 동안 데이터가 수집되어 samples라는 상수에 저장되었습니다. 직렬화에 사용 가능한 세 가지 프로토콜을 검증하기 위해 sereal_0, sereal_2, sereal_5라는 세 개의 변수를 생성하세요. 프로토콜 0은 읽을 수 있는 ASCII 형식이지만 효율적이지 않고, 프로토콜 2는 더 효율적인 이진 형식이며, 프로토콜 5는 최신 버전으로 가장 복잡한 기능이 추가되어 있습니다.

pickle.dumps()의 반환값을 저장하고, 인자로 samples 상수와 변수 이름에 해당하는 프로토콜 번호를 전달하세요. 예를 들어, sereal_0의 경우 protocol0으로 설정합니다. 아래와 같이: sereal_0 = pickle.dumps(samples, protocol=0). 미리 작성된 display() 함수와 함께 sereal_0, sereal_2, sereal_5를 사용하여 각 프로토콜에 따른 직렬화 방식의 차이를 확인합니다.

빨간 카펫 위에 있는 빛나는 X 표시로 걸어가 터미널을 응시하세요. output 변수를 덮어쓰고, pickle.loads() 함수에 sereal_5를 인자로 전달하여 지금까지 수집된 샘플 데이터를 역직렬화한 값을 저장하세요. 그리고 display() 함수에 pformat() 함수를 output 변수와 함께 사용하여 데이터를 확인합니다. 아래와 같이: await player.display(pformat(output)). 터미널에 표시된 각 월의 평점을 기록해 두어 나중에 차트로 나타낼 수 있도록 합니다.

빨간 카펫 위에 있는 어두운 X 표시로 걸어가 책상 앞에 서세요. 미리 작성된 write() 함수에 터미널에 표시되었던 각 월의 평점을 추가하세요. 평점을 "" 따옴표로 감싼 문자열로, 함수에 기재된 올바른 순서대로 추가하여 레벨을 완료합니다.

코드북