2011-10-20 17 views
5

Actualmente estoy usando la biblioteca httplib en Python 2.7 para obtener algunos encabezados de un sitio web para establecer a) el tamaño de archivo de una descarga yb) la última fecha de modificación del archivo. He usado algunas herramientas en línea y estos detalles sí existen.Extrayendo información de un Tuple (Python)

Actualmente estoy creando un script para mi código de Python y parece que funciona correctamente para recuperar la información requerida. No obstante, la respuesta que contiene la información del encabezado es una lista que contiene un número de tuplas. Una muestra de la respuesta es el siguiente: -

[('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')] 

Lo que estoy buscando que hacer es retirar de él, básicamente, el tamaño del archivo ("2501479") y la fecha ("Jue 20 Oct 2011 04:30:01 GMT "). ¿Alguna idea de cómo puedo hacer esto? Intenté originalmente variable[0] pero esto devuelve "'content-length', '2501479'". ¿Cómo puedo devolver el tamaño del archivo únicamente (en teoría, la segunda parte de la primera tupla en la lista).

Respuesta

7

Primero, puedes hacerlo un poco más fáciles de trabajar por convertir su lista de tuplas en un diccionario:

>>> 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 

para la fecha, me gustaría convertirlo en un objeto datetime usando la función email.utils.parsedate:

>>> import email.utils 
>>> email.utils.parsedate(headers['date']) 
(2011, 10, 20, 16, 1, 11, 0, 1, -1) 
2

Simplemente tiene que volver a indexarlo para acceder a la tupla. Como

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

para el tamaño y la fecha de la última modificación.

Nota: Esto solo funciona cuando los índices de content-length y last-modified son siempre los mismos.

4

En primer lugar, convertir las tuplas en una dict, y luego convertir el valor a int para obtener un número:

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 
0

Tienes tuplas dentro de una gama ... Por suerte, se puede hacer referencia (o eliminar la referencia dependiendo de su terminología) de la misma manera ...

por lo que v = x [0] le dará como usted declara la tupla ("'contenido-longitud', '2501479'") y v [0] le dará 'contenido-longitud' y v [1] le dará '2501479' (aunque es probable que desee hacer una int (v [0]) en eso con tal vez algún error de comprobación .

Puede que sea mejor poner esa matriz en un dict sin embargo; para que pueda estar seguro de que está obteniendo la longitud del contenido si la orden cambia alguna vez.

Afortunadamente, la sintaxis es casi la misma: utiliza el operador []. Sin embargo, voy a dejarte que mires las páginas man de python para ver cómo convertir una matriz -> dict (no puedo hacer todo por ti !!)

0
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') 
Cuestiones relacionadas