2012-03-13 18 views
13

Estoy escribiendo una secuencia de comandos de python para cargar archivos a s3 usando boto. Solo quiero cargar archivos modificados que puedo verificar por su última fecha de modificación. Pero no puedo encontrar la API para obtener la última modificación en boto API.¿Cómo puedo obtener la fecha de última modificación de los objetos S3 con boto?

+1

Ver http://mashupguide.net/1.0/html/ch16s07.xhtml hacia la parte inferior. Implica que un cubo tiene claves y las claves tienen un atributo 'last_modified'. ¿Es eso lo que estás buscando? Descargo de responsabilidad: No he usado S3 :) – gfortune

+0

Gracias gforture. Es realmente útil. – vreal

Respuesta

19

He aquí un fragmento de código/boto Python que imprimirá el atributo last_modified de todas las claves en un cubo:

>>> import boto 
>>> s3 = boto.connect_s3() 
>>> bucket = s3.lookup('mybucket') 
>>> for key in bucket: 
     print key.name, key.size, key.last_modified 
index.html 13738 2012-03-13T03:54:07.000Z 
markdown.css 5991 2012-03-06T18:32:43.000Z 
>>> 
+2

Para el registro esto no es perfecto; el last_modified es una cadena, cuando lo que probablemente desee es un datetime –

+10

Si desea un DateTime, puede usar boto.utils.parse_ts para analizar la cadena TZ y devolver un objeto DateTime. – garnaat

+5

por extraño que parezca, la función parse_ts no funciona con el formato devuelto por key.last_modified obtengo datos de tiempo 'Vie, 20 Jul 2012 16:57:27 GMT' no coincide con el formato '% Y-% m-% dT % H:% M:% S.% fZ ' –

4

Si está utilizando Django y django-storages, que puede un API no oficial en el s3boto backend:

>>> from storages.backends.s3boto import _parse_datestring 
>>> _parse_datestring("Fri, 20 Jul 2012 16:57:27 GMT") 
datetime.datetime(2012, 7, 21, 2, 57, 27) 

Por desgracia, como de Django almacenamientos 1.1.5, esto da una fecha y hora ingenuo. Es necesario utilizar django.utils.timezone para crear una versión conscientes:

>>> from django.utils import timezone 
>>> naive = _parse_datestring("Fri, 20 Jul 2012 16:57:27 GMT") 
>>> timezone.make_aware(naive, timezone.get_current_timezone()) 
datetime.datetime(2012, 7, 21, 2, 57, 27, tzinfo=<DstTzInfo 'Australia/Brisbane' EST+10:00:00 STD>) 
2

convertir el atributo last_modified a struct_time como se indica a continuación

import time 
for key in bucket.get_all_keys(): 
    time.strptime(key.last_modified[:19], "%Y-%m-%dT%H:%M:%S") 

Esto le dará una time.struct_time (tm_year, tm_mon, tm_mday, tm_hour tupla, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) para cada tecla en el cubo S3

5

esto está funcionando (TNX a jdennison desde arriba):

después de conseguir la llave de s3:

import time 
from time import mktime 
from datetime import datetime 

modified = time.strptime(key.last_modified, '%a, %d %b %Y %H:%M:%S %Z') 

#convert to datetime 
dt = datetime.fromtimestamp(mktime(modified)) 
+0

ha respondido al problema incorrecto: el problema consiste en obtener la fecha de los archivos s3, no en formatearla. – AdrianBR

Cuestiones relacionadas