如何在不使用boto3下载的情况下检查本地文件是否与S3对象相同?

时间:2017-06-13 21:44:42

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

如何检查本地文件是否与存储在S3中的文件相同而不下载?要避免一次又一次地下载大文件。 S3对象有电子标签,但如果文件是按部件上传的,并且这个question的解决方案似乎无法正常工作,则很难计算出来。有没有更简单的方法来避免不必要的下载

3 个答案:

答案 0 :(得分:4)

如果它们不同,我会比较上次修改时间和下载。此外,您还可以在下载之前比较尺寸。给定bucketkey和本地文件fname

import boto3
import os.path

def isModified(bucket, key, fname):
  s3 = boto3.resource('s3')
  obj = s3.Object(bucket, key)
  return int(obj.last_modified.strftime('%s')) != int(os.path.getmtime(fname))

答案 1 :(得分:2)

您可以使用小型本地数据库,例如文本文件?

  • 下载一次S3对象。不是它的ETag。
  • 计算你想要的任何签名。
  • 将(ETag,签名)对放入'数据库'。

下次,在继续下载之前,在“数据库”中查找ETag。如果存在,请计算现有文件的签名,并与ETag对应的签名进行比较。如果匹配,则远程文件与您拥有的文件相同。

有可能会使用不同的分块重新上传相同的文件,从而更改ETag。除非这很可能,否则你可以忽略假阴性并在极少数情况下重新下载文件。

答案 2 :(得分:0)

如果您不需要立即清点,则可以生成s3 storage inventory,然后将其导入数据库以备将来使用。

如图所示here for normal file and huge multipart file计算本地文件Etag。