본문 바로가기

WarGame/PythonChallenge

Python Challenge 06 :: zipfile

Challenge 06은 아래와 같습니다.



소스나 여러가지 정황 상 결제를 유도하는? 문제 인 줄 알았지만, 소스 제일 위에 zip이란 주석문이 보입니다.

zipper와 zip... 재미있네요 :)


URL에 channel.zip을 입력하니, zip파일이 다운로드 되고, 압축을 해제하니 어디선가 낯익은 "nothing is XXX"가 나옵니다. Challenge 04인가 05에서도 비슷한 문제가 있었던 기억이 납니다. "nothing"을 무작위로 찾아 들어갔던 문제인데 그것과 비슷한 문제라서 쉽게 접근했지만... 문제가 풀리지 않습니다.


다른 분들의 풀이를 보니, txt파일 안에 주석문을 넣을 수 있는 것 같습니다. 도무지 Windows10에서는 확인이 불가능한데 어떻게 확인이 가능한지 잘 모르겠습니다.


풀이방법은 zipfile이란 모듈을 사용하여, 압축을 해제하고 반복문을 통해 해당 txt파일에 주석문을 추출하면 될 것 같습니다.


※ python을 공부하는 것이 목적이므로 본 문제풀이에 앞서 zipfile 모듈에 대해 알아보겠습니다.


압축하기

1
2
3
4
5
6
7
import zipfile
 
flist = ["./python.exe""./pythonw.exe"]
 
with zipfile.ZipFile('testZip.zip''w') as myzip:
    for f in flist:
        myzip.write(f)

cs

(※ zipfile.ZipFile() - 대소문자에 유의하시기 바랍니다.)


압축할 파일 목록을 flist 변수에 넣고, with ~ as 구문을 이용해 zipfile.ZipFile()의 객체를 myzip 변수에 넣습니다. flist에 있는 파일목록을 가져와서 write()로 압축을 하면 됩니다.

(※ 여기서 with ~ as 구문이란, 파일을 처리할 때 open()을 하고 close()를 해야하는 번거로움이 있는데, 이것을 간편하게 해주는 구문으로 인터프리터가 구문이 끝나면 자동으로 close()를 해주게 됩니다.)



압축해제

1
2
3
import zipfile
 
zipfile.ZipFile('channel.zip').extractall()

cs


압축해제는 extractall() 함수로 간단하게 처리할 수 있습니다.



기타 zipfile 모듈 

1
2
3
4
5
6
7
8
9
import zipfile
 
with zipfile.ZipFile('testZip.zip') as myzip:
    print(myzip.namelist())
    print(myzip.read("README.txt"))
 
    zf = myzip.getinfo('README.txt')
    print(zf.filename)
    print(zf.file_size)

cs


zipfile()의 객체를 myzip변수에 넣어, myzip.namelist()로 압축 파일 목록을 볼 수 있고, read()를 통해 해당 파일의 내용을 볼 수 있습니다. getinfo() 객체를 zf 변수에 넣어 zf.filename으로 해당 파일명을 출력할 수 있고, file_size로 해당 파일크기를 출력할 수 있습니다. 그밖에 date_time,, CRC, compress_size 등이 있습니다.


결과는 아래와 같습니다.




다시 문제로 돌아와서, zipfile 모듈을 이용해 압축파일의 객체를 zf 변수에 넣고, zf.read()를 통해 해당 파일 안에 내용을 추출한 뒤, nothing 변수에 해당 숫자를 넣어 줍니다. 그러면 해당 숫자의 txt 파일에 들어가서 comment로 주석문을 차례로 추출하면 정답이 나오게 됩니다.


1
2
3
4
5
6
7
8
9
import zipfile
 
zf = zipfile.ZipFile("channel.zip")
nothing = "90052"
 
while nothing.isdigit():
    fContents = zf.read(nothing + ".txt").decode()
    nothing = fContents.split()[-1]
    print(zf.getinfo(nothing + ".txt").comment.decode(), end="")
cs



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

Python Challenge 08 :: bz2  (0) 2015.10.31
python challenge 07 :: Image(PIL)  (0) 2015.10.30
Python Challenge 05 :: pickle  (0) 2015.10.23
Python Challenge 04 :: urlparse  (0) 2015.10.22
Python Challenge 03 :: urlopen, re.findall  (0) 2015.10.22