web-dev-qa-db-ja.com

botoでS3オブジェクトの最終変更日時を取得するにはどうすればよいですか?

python botoを使用してファイルをs3にアップロードするスクリプトを書いています。最後に変更された日時で確認できる変更されたファイルのみをアップロードしたいのですが、APIが見つかりませんboto APIの最後の変更を取得します。

22
vreal

以下は、バケット内のすべてのキーのlast_modified属性を出力するPython/botoコードのスニペットです。

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

これは機能しています(上からtdenxから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))
7
Eyal Ch

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

5
Garreth McDaid

Django および Django-storages を使用している場合は、非公式APIs3botoバックエンド:

>>> 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の時点では、これは単純な日時を提供します。 awareバージョンを作成するには、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>) 
4
bradley.ayers

以下のように、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")

これにより、time.struct_time(tm_year、tm_mon、tm_mday、tm_hour、tm_min、tm_sec、tm_wday、tm_yday、tm_isdst)S3バケットの各キーのタプルが得られます。

3
Syed

これは最近のs3 list_objectsv2用です。 boto3クライアントは、lastModifedをdatetime.datetime形式で提供し、それを変換する方法は次のとおりです。
リンク: boto3リンク
および 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) 
0
ravi.zombie