Задания в pythonchallenge.com: задание 6 (now there are pairs)


Седьмая загадка очень проста, если сразу правильно начать. Открываем исходный код страницы и видим комментарий ‘<-- zip -->‘, больше ничего примечательного нет. Пробуем в адресной строке браузера изменить адрес: меняем ‘channel.html’ на ‘channel.zip’. По ссылке скачиваем zip-архив и распаковываем. В файле readme.txt содержатся дальнейшие инструкции для нашего маленького расследования.

welcome to my zipped list.

hint1: start from 90052
hint2: answer is inside the zip

Пробуем открыть файл 90052.txt и видим в нём ссылку на другой файл. Очевидно, что в текстовых файлах зашифрован список, т.е. один файл ссылается на другой и т.д. Автоматизируем процесс считывания списка:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from zipfile import ZipFile
from urllib.request import urlopen
from io import BytesIO
 
f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read()
arc = ZipFile(BytesIO(f), 'r')
file_name = '90052.txt'
comments = []
 
while True:
    try:
        file_content = arc.open(file_name).readline().decode()
        file_name = file_content.split(' ')[-1] + '.txt'
    except Exception as err:
        print(file_content)
        break
from zipfile import ZipFile
from urllib.request import urlopen
from io import BytesIO

f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read()
arc = ZipFile(BytesIO(f), 'r')
file_name = '90052.txt'
comments = []

while True:
	try:
		file_content = arc.open(file_name).readline().decode()
		file_name = file_content.split(' ')[-1] + '.txt'
	except Exception as err:
		print(file_content)
		break

Мы считываем одну строку из файла, если в ней есть ссылка на текстовый файл, то переходим к нему, если нет то прерывем выполнение и выводим на экран содержимое последнего файла.
Содержание последнего файла — это ещё одна подсказка к расшифровке:

Collect the comments.

Сложив её со второй подсказкой из файла 90052.txt, становится ясно, что нужно собрать комментарии к файлам внутри zip-архива. В Python 3 для работы с zip-архивами есть отдельный модуль ‘zipfile’. Дальше всё просто: считываем комментарии и выводим на экран. Вот полный текст моего решения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from zipfile import ZipFile
from urllib.request import urlopen
from io import BytesIO
 
f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read()
arc = ZipFile(BytesIO(f), 'r')
file_name = '90052.txt'
comments = []
 
while True:
    try:
        file_content = arc.open(file_name).readline().decode()
        file_name = file_content.split(' ')[-1] + '.txt'
        comments.append(arc.getinfo(file_name).comment.decode())
    except Exception as err:
        print(file_content)
        break
 
for item in comments:
    print(item, end = '')
from zipfile import ZipFile
from urllib.request import urlopen
from io import BytesIO

f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read()
arc = ZipFile(BytesIO(f), 'r')
file_name = '90052.txt'
comments = []

while True:
	try:
		file_content = arc.open(file_name).readline().decode()
		file_name = file_content.split(' ')[-1] + '.txt'
		comments.append(arc.getinfo(file_name).comment.decode())
	except Exception as err:
		print(file_content)
		break

for item in comments:
	print(item, end = '')
Спойлер! Картинка с ответом


Bookmark the permalink.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *