Извлечение информации из кортежа (Python) - PullRequest
5 голосов
/ 20 октября 2011

В настоящее время я использую библиотеку httplib в Python 2.7 для получения некоторых заголовков с веб-сайта, чтобы установить а) размер файла для загрузки и б) дату последнего изменения файла. Я использовал некоторые онлайн-инструменты, и эти детали существуют.

В настоящее время я пишу свой код на Python, и он, кажется, работает правильно, возвращая необходимую информацию. Тем не менее, ответ, содержащий информацию заголовка, представляет собой список, содержащий несколько кортежей. Пример ответа ниже: -

[('content-length', '2501479'),
 ('accept-ranges', 'bytes'),
 ('vary', 'Accept-Encoding'),
 ('server', 'off'),
 ('last-modified', 'Thu, 20 Oct 2011 04:30:01 GMT'),
 ('etag', '"2c8171a-262b67-4afb368edfffc"'),
 ('date', 'Thu, 20 Oct 2011 16:01:11 GMT'),
 ('content-type', 'text/plain')]

Что я собираюсь сделать, так это вырезать в основном размер файла ("2501479") и дату ("Чт, 20 октября 2011 04:30:01 GMT"). Любые идеи, как я могу сделать это? Я изначально пытался variable[0], но это возвращает "'content-length', '2501479'". Как я могу вернуть только размер файла (теоретически вторая часть первого кортежа в списке!).

Ответы [ 5 ]

7 голосов
/ 20 октября 2011

Во-первых, вы можете немного упростить работу, превратив свой список кортежей в словарь:

>>> headers = [('content-length', '2501479'),
...  ('accept-ranges', 'bytes'),
...  ('vary', 'Accept-Encoding'),
...  ('server', 'off'),
...  ('last-modified', 'Thu, 20 Oct 2011 04:30:01 GMT'),
...  ('etag', '"2c8171a-262b67-4afb368edfffc"'),
...  ('date', 'Thu, 20 Oct 2011 16:01:11 GMT'),
...  ('content-type', 'text/plain')]
>>> 
>>> headers = dict(headers)
>>> int(headers['content-length'])
2501479

Для даты я бы превратил его в datetime объект, используя функцию email.utils.parsedate :

>>> import email.utils
>>> email.utils.parsedate(headers['date'])
(2011, 10, 20, 16, 1, 11, 0, 1, -1)
4 голосов
/ 20 октября 2011

Сначала преобразуйте кортежи в dict, а затем преобразуйте значение в int, чтобы получить число:

response_tupels = [('content-length', '2501479'), ('accept-ranges', 'bytes'),]
response = dict(response_tupels)
try:
  content_length = int(response['content-length'])
except KeyError:
  raise # Handle missing content-length here
2 голосов
/ 20 октября 2011

Вы просто должны проиндексировать его снова, чтобы получить доступ к кортежу. Как

length = variable[0][1]
last_mod = variable[4][1]

для размера и даты последней модификации.

Примечание: работает только тогда, когда индексы content-length и last-modified всегда одинаковы.

0 голосов
/ 20 октября 2011
mas = [('content-length', '2501479'),
 ('accept-ranges', 'bytes'),
 ('vary', 'Accept-Encoding'),
 ('server', 'off'),
 ('last-modified', 'Thu, 20 Oct 2011 04:30:01 GMT'),
 ('etag', '"2c8171a-262b67-4afb368edfffc"'),
 ('date', 'Thu, 20 Oct 2011 16:01:11 GMT'),
 ('content-type', 'text/plain')]
mas = dict(mas)
mas.get('content-length')
0 голосов
/ 20 октября 2011

У вас есть кортежи внутри массива ... К счастью, вы можете ссылаться (или разыменовывать их в зависимости от вашей терминологии) таким же образом ...

, так что v = x [0] выдаст вас при указании кортежа ("content-length", '2501479' ") и v [0] выдаст вам 'content-length', а v [1] выдаст вам '2501479' (хотя вы, вероятно, захотите сделать int (v [0]) для этого с некоторой проверкой ошибок.

Возможно, вам лучше поместить этот массив в диктовку; так что вы можете быть уверены, что вы получаете длину контента, если порядок когда-либо изменится.

К счастью, синтаксис практически одинаков - он использует оператор []. Тем не менее, я оставлю вам возможность просматривать справочные страницы по питону, чтобы узнать, как преобразовать массив -> dict (не может сделать все для вас !!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...