python botoを使用してファイルをs3にアップロードするスクリプトを書いています。最後に変更された日時で確認できる変更されたファイルのみをアップロードしたいのですが、APIが見つかりませんboto APIの最後の変更を取得します。
以下は、バケット内のすべてのキーの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
>>>
これは機能しています(上から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))
(S3)LastModified
pythonオブジェクトを使用すると、Boto3はObject
の日時オブジェクトを返します。
曲がりくねった文字列操作を実行する必要はありません。
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)
Django および Django-storages を使用している場合は、非公式APIをs3botoバックエンド:
>>> 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>)
以下のように、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バケットの各キーのタプルが得られます。
これは最近の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)