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

직렬화 모듈
Marshal 및 Pickle 모듈

목적

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

길을 따라 계속 가다 보면, 미래 수확을 위해 개발 중인 토지의 물 분배 및 토양 품질을 모니터링하는 몇몇 스테이션이 나옵니다. 데이터를 처리하기 위해서는 데이터를 직렬화하는 것이 효율적입니다. 일반화된 솔루션으로 JSON을 사용하는 것이 효과적일 수 있지만, 파이썬 전용 직렬화 방법으로 Marshal과 Pickle 모듈도 있습니다. Marshal 모듈은 데이터를 이진(binary)으로 변환하여 빠른 직렬화/역직렬화를 수행하도록 설계되어 간단한 데이터 전송에 이상적입니다. Pickle 모듈은 느리지만 더 복잡한 데이터 구조를 처리하도록 설계되어 더 유연하며, 대규모 또는 우선순위가 높은 데이터 구조에 적합합니다.

Marshal과 Pickle 모듈을 사용하려면 import marshalimport pickle을 작성하여 함수를 가져옵니다. 이번 레벨에서는 다음 함수를 사용할 것입니다:

  • marshal.dumps(): 데이터를 이진 형식으로 직렬화하며, 파이썬 내부에서 속도에 최적화되어 있습니다. 하나의 인수(직렬화할 데이터)를 받아 기본 데이터 타입만 지원합니다.
  • marshal.loads(): 이진 데이터를 역직렬화하여 파이썬에서 읽을 수 있는 데이터 타입으로 변환합니다. 기능은 제한적이지만 실행 속도가 빠르며, 하나의 인수(역직렬화할 데이터)를 받습니다.
  • pickle.DEFAULT_PROTOCOL: 현재 사용 중인 파이썬 버전에서 Pickle 직렬화의 기본 프로토콜 버전을 확인합니다. 프로토콜은 데이터 직렬화 방식을 결정합니다.
  • pickle.HIGHEST_PROTOCOL: 현재 사용 중인 파이썬 버전에서 지원하는 가장 높은 Pickle 직렬화 프로토콜 버전을 확인합니다.
  • pickle.dumps(): 지정된 프로토콜에 따라 복잡한 파이썬 데이터 구조를 이진 형식으로 직렬화합니다. 두 개의 인수(직렬화할 데이터, 사용할 프로토콜 버전)를 받습니다.
  • pickle.loads(): 이진 데이터를 역직렬화하여 파이썬 객체로 변환합니다. 하나의 인수(역직렬화할 데이터)를 받습니다.

또한 from pprint import pformat을 사용해 가져오는 pformat라는 포맷팅 모듈을 사용할 것입니다. 이를 통해 pformat() 함수를 사용해 딕셔너리와 같은 데이터 구조를 보기 좋게 포맷하여 정보를 명확하게 표시할 수 있습니다.

시작하려면 작은 모니터링 스테이션 내부의 밝은 X 표식으로 걸어가 컴퓨터 터미널을 향하세요. 이 스테이션은 주변 지형의 수압과 토양 상태를 모니터링하며, 여기에는 스테이션에서 수집된 파이썬 데이터가 들어 있는 reading이라는 상수가 있습니다.

reading을 인수로 전달하여 marshal.dumps() 함수의 반환값을 저장하는 data라는 변수를 만드세요. 예: data = marshal.dumps(reading). 직렬화된 변수를 확인하려면 미리 작성된 display() 함수에 data 변수를 전달해 표시하세요.

스테이션을 나와 금색 X 표식으로 가서 open() 함수를 사용해 문을 열고 사무실에 들어가세요. 터미널 앞의 밝은 X 표식으로 이동하여 방금 직렬화한 데이터를 역직렬화하세요. 이전의 data 변수를 인수로 전달하여 marshal.loads() 함수를 호출한 값을 output이라는 변수에 저장하세요. 미리 작성된 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의 경우 protocol=0을 사용합니다. 즉, sereal_0 = pickle.dumps(samples, protocol=0)입니다. 직렬화 방식의 차이를 확인하려면 미리 작성된 display() 함수에 sereal_0, sereal_2, sereal_5를 전달해 표시하세요.

빨간 카펫 위의 밝은 X 표식으로 이동해 터미널을 바라보세요. output 변수를 덮어쓰고, sereal_5를 인수로 전달하여 pickle.loads()의 반환값을 저장해 지금까지 수집된 샘플 데이터를 역직렬화하세요. 데이터를 확인하려면 display() 함수와 pformat() 함수를 조합하여 output 변수를 전달합니다. 예: await player.display(pformat(output)). 터미널에 표시된 각 월별 등급을 기록해 두세요.

빨간 카펫 위의 어두운 X 표식으로 이동해 책상을 바라보세요. 미리 작성된 write() 함수에 터미널에 표시된 각 월별 등급을 이전에 기록한 순서대로 문자열("")로 추가하세요. 이를 완료하면 레벨이 완료됩니다.

코드북