Coding for KidsCoding for Kids
창의적인 레벨도전 과제교사 가이드
기능 투표
고급 파이썬 개발 과정
챕터
>
레벨

직렬화 모듈
Marshal와 Pickle 모듈

목표

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

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

Marshal과 Pickle 모듈을 사용하려면, import marshalimport pickle 을 작성하여 해당 함수들을 임포트하세요. 우리의 목적을 위해 다음 함수를 사용할 것입니다:

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

이 모듈과 함수들에 추가하여, pprint 라는 포맷팅 모듈도 사용할 것이며, 이는 from pprint import pprint 를 사용하여 임포트됩니다. 이를 통해, 사전(dictionary)와 같은 데이터 구조를 보기 좋게 포맷하는 pprint() 함수를 사용할 수 있습니다.

먼저, 작은 모니터링 스테이션 내부에 있는 빛나는 X 표시로 이동하여 컴퓨터 단말기에 얼굴을 맞추세요. 이 스테이션은 작물 재배를 위해 개발 중인 인근 지형의 수압과 토양 상태를 모니터링합니다. 파이썬 데이터가 저장된 상수 reading 이 존재합니다.

data 라는 변수를 생성하고, 인자로 reading 을 전달하여 marshal.dumps() 함수의 결과값을 저장하세요. 예를 들어, data = marshal.dumps(reading) 와 같이 하세요. 미리 작성된 display() 함수를 사용해 data 변수를 확인하여 직렬화된 데이터를 확인합니다.

스테이션을 나와 금색 X 표시로 이동한 후, open() 함수를 사용해 문을 열어 사무실에 입장하세요. 단말기 앞에 있는 빛나는 X 표시로 이동하여, 방금 직렬화한 데이터를 역직렬화하세요. output 이라는 변수를 생성하고, 인자로 이전의 data 변수를 전달하여 marshal.loads() 함수의 결과값을 저장하세요. 모니터링 스테이션에서 수집한 직렬화된 데이터에 접근하려면, display() 함수와 함께 data 변수를 사용하세요.

사무실의 파란 카펫 위에 있는 빛나는 X 표시로 이동하여 단말기를 바라보세요. 여기서 Pickle 모듈이 데이터를 처리할 때 사용할 직렬화 프로토콜을 확인할 것입니다. 미리 작성된 write() 함수에 인자로 pickle.DEFAULT_PROTOCOLpickle.HIGHEST_PROTOCOL 을 설정하세요. 이는 현재 직렬화 프로토콜뿐만 아니라, 현재 사용 가능한 최신 직렬화 프로토콜을 확인할 수 있게 해줍니다.

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

sereal_0, sereal_2sereal_5 변수에는 pickle.dumps() 함수의 반환값을 저장할 것이며, 인자로는 samples 상수와 변수 이름에 해당하는 숫자의 protocol 값을 전달할 것입니다. 예를 들어, sereal_0 에 대해서는 protocol0 으로 설정하여 sereal_0 = pickle.dumps(samples, protocol=0) 와 같이 작성하세요. 미리 작성된 display() 함수를 사용하여 각 프로토콜에 따른 직렬화 결과가 어떻게 다른지 확인하세요.

빨간 카펫 위에 있는 빛나는 X 표시로 이동하여 단말기를 바라보세요. output 변수를 덮어쓰고, 인자로 sereal_5 를 전달하여 pickle.loads() 함수를 사용해 지금까지 수집된 샘플 데이터를 역직렬화하세요. 데이터를 확인하기 위해 display() 함수를 사용하고, pprint() 함수를 output 변수와 함께 추가하세요. 예를 들어, await player.display(pprint(output)) 와 같이 작성하세요. 단말기에 표시된 각 달의 등급을 기록해 두어 나중에 차트로 작성할 수 있도록 하세요.

빨간 카펫 위 어두운 X 표시로 이동하여 책상을 바라보세요. 미리 작성된 write() 함수에, 단말기에서 이전에 표시된 각 달의 등급을 문자열(""로 감싸진 형태)로 올바른 순서대로 추가하여 레벨을 완료하세요.

코드북