본문 바로가기

WarGame/PythonChallenge

Python Challenge 05 :: pickle

 Challenge 05는 다음과 같습니다.

 

 

무엇을 발음해야 할까요? 소스를 보면 peak hell을 발음하면 친숙한 무언가가 들린다고 합니다.

무슨 말인지 몰라서 검색해보니 pickle이라는 모듈이 있다는 것을 알게 되었습니다.

 

일반 문자열에 경우 f.write() 함수로 그냥 입력하면 되지만 튜플, 리스트 같은 객체들은 일반적인 방법으로 파일에 입력하지 못합니다. 이럴 때 사용하는 것이 pickle 입니다.

 

프로그래밍적으로 이야기 한다면,

  • pickling(피클링)이란 객체를 바이트 스트림으로 바꾸는 과정
  • unpicling(언피클링)이란 그 반대 과정

이라고 말할 수 있습니다. 주로 객체를 파일이나 DB에 저장할 때 사용한다고 합니다.

 

pickle의 사용법은 아래와 같습니다.

 

1
2
3
4
5
6
7
8
import pickle
table = {'a' : '123''b' : '456''c' : '789'}
= open('pic_test.txt''wb')
pickle.dump(table, f)
 
= open('pic_test.txt''rb')
result = pickle.load(f)
print(result)
cs
 

윗 부분은 피클링 과정이고, 아랫 부분은 언피클링 과정입니다.

 

table 변수에 객체를 대입하고 pickle 작업을 위해서는 반드시 파일 객체 사용시 이진 모드로 열어야 합니다. dump() 함수로 피클링을 하고, load()로 언피클링 합니다.

  • dump() : 피클링
  • load() : 언피클링

다시 문제로 돌아 와서 소스를 보니 banner.p라는 링크가 있습니다.

해당 주소로 들어가 보니 Explorer로 열면 파일이 다운로드 되고, crome으로 열면 페이지가 나옵니다.

 

 

첫번째, urlopen()으로 unpickling 하기

1
2
3
4
5
6
from urllib.request import urlopen
import pickle 
 
url = urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
banner = pickle.load(url)
print(banner)
cs

 

두번째, 파일로 unpickling 하기

1
2
3
4
5
import pickle
 
= open('banner.p''rb')
banner = pickle.load(f)
print(banner)
cs
 

 

언피클링 결과 아래와 같은 객체(리스트)로 되어 있는 것을 확인했습니다.

 

 

많은 고민 끝에 해당 리스트는 (특정 문자, 반복횟수)로 되어 있다는 것을 알게 되었습니다.

 

아래와 같은 코드로 정답을 도출할 수 있었습니다.

1
2
3
4
5
6
7
8
9
import pickle
 
= open('banner.p''rb')
banner = pickle.load(f)
 
for i in banner:
    for char, repeat in i:
        print(char*repeat, end='')
    print()
cs

 

 

 

 


'WarGame > PythonChallenge' 카테고리의 다른 글

python challenge 07 :: Image(PIL)  (0) 2015.10.30
Python Challenge 06 :: zipfile  (0) 2015.10.26
Python Challenge 04 :: urlparse  (0) 2015.10.22
Python Challenge 03 :: urlopen, re.findall  (0) 2015.10.22
Python Challenge 02 :: count  (0) 2015.10.22