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

How to check if local file is same as S3 object without downloading it with boto3?

如何在不下载的情况下检查本地文件是否与存储在S3中的文件相同?避免一次又一次地下载大文件。 S3 对象具有电子标签,但如果文件是分段上传的,并且此问题的解决方案似乎不起作用,则它们很难计算。有没有一些更简单的方法可以避免不必要的下载?


如果它们不同,我会比较最后修改时间并下载。此外,您还可以在下载前比较大小。给定一个 bucketkey 和一个本地文件 fname:

1
2
3
4
5
6
7
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))


你能用一个小的本地数据库吗?一个文本文件?

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

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

同一文件可能会以不同的分块方式重新上传,从而更改 ETag。除非这很有可能,否则您可以忽略误报并在这种极少数情况下重新下载文件。


如果您不需要即时库存,您可以生成 s3 存储库存,然后将它们导入您的数据库以备将来使用。

为普通文件和大型多部分文件计算本地文件 Etag,如下所示。