如何使用boto获取S3对象的上次修改日期时间?

时间:2012-03-13 06:31:32

标签: python amazon-s3 amazon-web-services boto

我正在编写一个python脚本,使用boto将文件上传到s3。我想只上传已更改的文件,我可以通过它的最后修改日期时间来检查。但我找不到api来获取boto API中的最后修改。

9 个答案:

答案 0 :(得分:29)

这是一段Python / boto代码,它将打印存储桶中所有键的last_modified属性:

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

答案 1 :(得分:7)

这是有效的(从上面开始到jdennison):

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

答案 2 :(得分:4)

如果您使用的是Djangodjango-storages,则可以在 s3boto 后端使用非官方API

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

不幸的是,从django-storages 1.1.5开始,这给出了一个天真的日期时间。您需要使用django.utils.timezone创建识别版本:

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

答案 3 :(得分:2)

将last_modified属性转换为struct_time,如下所示

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

这将为S3存储桶中的每个键提供time.struct_time(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)元组

答案 4 :(得分:2)

对于仅一个s3对象,您可以使用boto客户端的head_object()方法,该方法比list_objects_v2()的对象更快,因为返回的内容较少。返回值是datetime,类似于所有boto响应,因此易于处理。

head_object()方法具有对象修改时间周围的其他功能,可以在list_objects()结果之后无需进一步调用就可以利用该功能。

查看此: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.head_object

import boto3

s3 = boto3.client('s3')
response = client.head_object(Bucket, Key)
datetime_value = response["LastModified"]

答案 5 :(得分:0)

当您使用(S3)LastModified python对象时,Boto3返回Object的日期时间对象:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.last_modified

您不需要执行任何曲折的字符串操作。

LastModified与今天的日期进行比较(Python3):

import boto3
from datetime import datetime, timezone

today = datetime.now(timezone.utc)

s3 = boto3.client('s3', region_name='eu-west-1')

objects = s3.list_objects(Bucket='my_bucket')

for o in objects["Contents"]:
    if o["LastModified"] == today:
        print(o["Key"])

您只需要知道LastModifed可以识别时区,因此与之比较的任何日期也必须可以识别时区,因此:

datetime.now(timezone.utc)

答案 6 :(得分:0)

这是针对最近的s3 list_objectsv2的。 boto3客户端以datetime.datetime格式提供lastModifed,转换方式如下
链接:boto3 link
aws s3 listobj

import datetime
from dateutil.tz import tzutc
# node s3 response '2019-06-17T18:42:57.000Z'
# python boto3 s3 response datetime.datetime(2019, 10, 1, 22, 41, 55, tzinfo=tzutc())
'''  {'ETag': '"c8ba0ad5003832f63690ea8ff9b66052"',
  'Key': 'SOMEFILE',
  'LastModified': datetime.datetime(2019, 10, 2, 18, 50, 47, tzinfo=tzutc()),
  'Size': 6390623,
  'StorageClass': 'STANDARD'}
'''
l = datetime.datetime(2019, 10, 1, 22, 41, 55, tzinfo=tzutc())
get_last_modified = int(l.strftime('%s'))
print(l)
print(get_last_modified) 

答案 7 :(得分:0)

使用Resource,可以获得iterator of all objects,然后检索ObjectSummarylast_modified属性。

import boto3

s3 = boto3.resource('s3')
bk = s3.Bucket(bucket_name)

[obj.last_modified for obj in bk.objects.all()][:10]

返回

[datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 38, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 38, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 38, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 23, 37, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 17, 13, 20, 20, tzinfo=tzlocal()),
 datetime.datetime(2020, 4, 20, 8, 30, 2, tzinfo=tzlocal()),
 datetime.datetime(2020, 3, 26, 15, 33, 58, tzinfo=tzlocal())]

答案 8 :(得分:0)

import boto3
from boto3.session import Session

session = Session(aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
my_bucket = s3.Bucket(BUCKET_NAME)

for obj in my_bucket.objects.all():
    print('{} | {}'.format(obj.key, obj.last_modified))