Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取S3对象';使用boto最后修改的日期时间_Python_Amazon S3_Amazon Web Services_Boto - Fatal编程技术网

Python 获取S3对象';使用boto最后修改的日期时间

Python 获取S3对象';使用boto最后修改的日期时间,python,amazon-s3,amazon-web-services,boto,Python,Amazon S3,Amazon Web Services,Boto,我正在编写一个Python脚本,使用Boto将文件上传到S3。我只想上传更改过的文件(我可以通过“last modified”日期时间进行检查),但我找不到Boto API端点来获取上次修改的日期。这里有一段Python/Boto代码,它将打印bucket中所有键的last_modified属性: >>> import boto >>> s3 = boto.connect_s3() >>> bucket = s3.lookup('mybuck

我正在编写一个Python脚本,使用Boto将文件上传到S3。我只想上传更改过的文件(我可以通过“last modified”日期时间进行检查),但我找不到Boto API端点来获取上次修改的日期。

这里有一段Python/Boto代码,它将打印bucket中所有键的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
>>>
如果您正在使用and,则可以在s3boto后端中使用非官方API

不幸的是,在django storages 1.1.5中,这给出了一个幼稚的日期时间。您需要使用
django.utils.timezone
创建一个感知版本:

来自django.utils导入时区的
>>
>>>朴素=_parse_datestring(“2012年7月20日星期五16:57:27 GMT”)
>>>timezone.make_aware(naive,timezone.get_current_timezone())
datetime.datetime(2012,7,21,2,57,27,tzinfo=)

将上次修改的属性转换为结构时间,如下所示

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_sece、tm_wday、tm_yday、tm_isdst)元组,该元组正在工作(从上面的tnx到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)
对象
python对象时,Boto3为
LastModified
返回datetime对象:

您不需要执行任何复杂的字符串操作

要将上次修改的日期与今天的日期(Python3)进行比较,请执行以下操作:

您只需要知道,
lastmodifyd
是时区感知的,因此与之比较的任何日期也必须是时区感知的,因此:


datetime.now(timezone.utc)
这是针对最近的s3列表对象的。boto3客户端以datetime.datetime格式提供LastModified,转换方法如下
链接:

使用,可以获取,然后检索的
last\u modified
属性

导入boto3
s3=boto3.resource('s3')
bk=s3.Bucket(Bucket\u名称)
[obj.last_为bk.objects.all()中的obj修改[: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())]

对于一个s3对象,您可以使用boto客户端的
head\u object()
方法,该方法对于一个对象比
list\u objects\u v2()
方法更快,因为返回的内容更少。返回的值与所有boto响应类似,因此易于处理

head\u object()

见此:


朝底部看。这意味着一个bucket具有键,并且键具有
last\u modified
属性。这就是你要找的吗?免责声明:我没有使用S3:)谢谢您的支持。这真的很有帮助。就记录而言,这并不完美;最后修改的是一个字符串,当您可能想要的是一个DateTime如果您想要一个DateTime,您可以使用boto.utils.parse_ts解析TZ字符串并返回一个DateTime对象。奇怪的是,parse_ts函数不能使用键返回的格式。最后修改的我得到时间数据'Fri,2012年7月20日16:57:27 GMT“与格式“%Y-%m-%dT%H:%m:%S.%fZ”不匹配仅供将来参考,这对我有效:time.strtime(key.last_modified,“%a,%d%b%Y%H:%m:%S%Z”)。值得注意的是,返回的格式取决于您如何获得密钥!使用boto 2.34.0,从
bucket.get_all_keys()
获取一个键,返回一个类似
u'2015-03-16T14:02:50.000Z'
的字符串,而通过
bucket获取相同的键。get_key(name)
结果是:
'Mon,2015年3月16日14:02:50 GMT'
。简而言之:
bucket.get_key(bucket.get_all_key()[0].name)。last_modified==bucket.get_all_key()[0]。last_modified
False
。您回答了错误的问题-问题是关于获取s3文件的日期,而不是关于格式化。时间数据u'2018-06-10T06:31:35.000Z'与格式“%a”不匹配,%d%b%Y%H:%M:%S%Z'我认为head\u对象是元数据检索的合适调用。
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))
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"])
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) 
[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())]
import boto3

s3 = boto3.client('s3')
response = client.head_object(Bucket, Key)
datetime_value = response["LastModified"]
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))