My Drive

pythonchallenge #06 - zipfile 본문

writeup

pythonchallenge #06 - zipfile

sunnyeo.park 2014. 12. 3. 00:50

# 여섯 번째 문제

마찬가지로 사진만 있어서 소스를 보았다.



아래 주석에는 별다른 이야기가 없고, 눈에 띄는 단어는 zip이라는 주석이다.



혹시나해서 url을 .zip으로 바꿔보니 아래와 같이 파일을 다운받을 수 있었다.

http://www.pythonchallenge.com/pc/def/channel.zip



910개의 텍스트 파일이 압축되어있엇다. readme.txt라는 파일이 아래은 아래와 같은 내용을 담고 있었고,  909개의 파일은 모두 지난 4번 문제와 비슷하게 이루어져 있었다.(Next nothing is ______)

시작 숫자는 90052이다.


처음에는 뭣도 모르고 우선 압축을 푼 후 아래와 같이 쉽게 코드를 짤 수 있었다.


결과는 아래와 같이 잘 나왔다.

그런데 comments를 모으라니???

알고보니 압축할 때는 comments라는 파일 설명을 쓸 수가 있었다.

아래 그림 맨 오른쪽 줄을 보면 알 수 있다. 저거를 순서대로 모아야 하는 것 같다.


이번에는 zipfile 모듈을 이용하여 압축을 풀지 않고 파일과 comments에 접근하는 방법을 이용하여 프로그램을 작성하였다.


결과는 아래와 같이 잘 나왔다.


전과 마찬가지로 빈칸 없이도 할 수 있다.



그러므로

http://www.pythonchallenge.com/pc/def/hockey.html

위와같이 url을 바꿔주면 다음단계로 넘어가는 줄 알았는데, 아래와 같이 떴다.

공기에 있고, 문자를 잘 봐라??? 

아... 자세히 보니 hockey는 OXYGEN이라는 단어로 이루어져 있었다.


따라서

http://www.pythonchallenge.com/pc/def/oxygen.html

위와같이 url을 바꿔주면 다음단계로 넘어간다.



※ zipfile

zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) : zipfile 객체 생성

ZipFile.namelist() : 압축되어 있는 파일 목록을 리턴

import zipfile

zf = zipfile.ZipFile('example.zip', 'r')
print zf.namelist()
$ python zipfile_namelist.py

['README.txt']

ZipFile.open(name[, mode[, pwd]]) : 압축되어 있는 파일을 압축해제하여 open

ZipFile.infolist() 아래와 같은 zipinfo를 리턴

* zipinfo

- ZipInfo.filename

- ZipInfo.date_time (index 0:year, 1:month, 2:day, 3:hours, 4:minutes, 5:seconds)

- ZipInfo.comment

- ZipInfo.extra

- ZipInfo.create_system

- ZipInfo.create_version

- ZipInfo.extract_version

- ZipInfo.reserved

- ZipInfo.flag_bits

- ZipInfo.volume

- ZipInfo.internal_attr

- ZipInfo.external_attr

- ZipInfo.header_offset

- ZipInfo.CRC

- ZipInfo.compress_size

- ZipInfo.file_size

import datetime
import zipfile

def print_info(archive_name):
    zf = zipfile.ZipFile(archive_name)
    for info in zf.infolist():
        print info.filename
        print '\tComment:\t', info.comment
        print '\tModified:\t', datetime.datetime(*info.date_time)
        print '\tSystem:\t\t', info.create_system, '(0 = Windows, 3 = Unix)'
        print '\tZIP version:\t', info.create_version
        print '\tCompressed:\t', info.compress_size, 'bytes'
        print '\tUncompressed:\t', info.file_size, 'bytes'
        print

if __name__ == '__main__':
    print_info('example.zip')
$ python zipfile_infolist.py

README.txt
        Comment:
        Modified:       2007-12-16 10:08:52
        System:         3 (0 = Windows, 3 = Unix)
        ZIP version:    23
        Compressed:     63 bytes
        Uncompressed:   75 bytes

ZipFile.extract(member[, path[, pwd]]) : 현재 디렉토리에서 한 파일 압축 해제

ZipFile.extractall([path[, members[, pwd]]]) : 현재 디렉토리에 있는 모둔 파일 압축 해제

ZipFile.setpassword(pwd) : 패스워드 설정 (압축 해제 시 필요)

ZipFile.read(name[, pwd])

ZipFile.write(filename[, arcname[, compress_type]])

import zipfile

zf = zipfile.ZipFile('example.zip')
for filename in [ 'README.txt', 'notthere.txt' ]:
    try:
        data = zf.read(filename)
    except KeyError:
        print 'ERROR: Did not find %s in zip file' % filename
    else:
        print filename, ':'
        print repr(data)
    print
$ python zipfile_read.py

README.txt :
'The examples for the zipfile module use this file and example.zip as data.\n'

ERROR: Did not find notthere.txt in zip file
from zipfile_infolist import print_info
import zipfile

print 'creating archive'
zf = zipfile.ZipFile('zipfile_write.zip', mode='w')
try:
    print 'adding README.txt'
    zf.write('README.txt')
finally:
    print 'closing'
    zf.close()

print
print_info('zipfile_write.zip')
$ python zipfile_write.py
creating archive
adding README.txt
closing

README.txt
        Comment:
        Modified:       2007-12-16 10:08:50
        System:         3 (0 = Windows, 3 = Unix)
        ZIP version:    20
        Compressed:     75 bytes
        Uncompressed:   75 bytes


'writeup' 카테고리의 다른 글

pythonchallenge #08 - bz2  (0) 2014.12.09
pythonchallenge #07 - image  (0) 2014.12.09
pythonchallenge #05 - pickle  (0) 2014.12.02
pythonchallenge #04 - html  (0) 2014.12.01
pythonchallenge #03  (0) 2014.11.30
Comments