Как загрузить файл с S3 с помощью boto только в том случае, если удаленный файл является более новым, чем локальная?
Я пытаюсь загрузить файл с S3 с помощью boto, но только если локальная копия файла старше удаленного файла.
Я использую заголовок «If-Modified-Since» и код ниже:
#!/usr/bin/python import os import datetime import boto from boto.s3.key import Key bucket_name = 'my-bucket' conn = boto.connect_s3() bucket = conn.get_bucket(bucket_name) def download(bucket, filename): key = Key(bucket, filename) headers = {} if os.path.isfile(filename): print "File exists, adding If-Modified-Since header" modified_since = os.path.getmtime(filename) timestamp = datetime.datetime.utcfromtimestamp(modified_since) headers['If-Modified-Since'] = timestamp.strftime("%a, %d %b %Y %H:%M:%S GMT") try: key.get_contents_to_filename(filename, headers) except boto.exception.S3ResponseError as e: return 304 return 200 print download(bucket, 'README')
Проблема в том, что, когда локальный файл не существует, все работает хорошо, и файл загружается. Когда я запускаю сценарий во второй раз, моя функция возвращает 304, как ожидалось, но файл, который был ранее загружен, удаляется.
- Как клонировать ключ в Amazon S3 с помощью Python (и boto)?
- Клавиши списка S3 boto иногда возвращают ключ каталога
- Настройки типа содержимого AWS в S3 с помощью Boto3
- эквивалент python boto для хранилища google
- Используя библиотеку Amazon s3 boto, как я могу получить URL-адрес сохраненного ключа?
boto.s3.key.Key.get_contents_to_filename
открыть файл с wb
режимом; он обрезает файл в начале функции ( boto / s3 / key.py ). Кроме того, он удаляет файл при возникновении исключения.
Вместо get_contents_to_filename
вы можете использовать get_contents_to_file
с различным открытым режимом.
def download(bucket, filename): key = Key(bucket, filename) headers = {} mode = 'wb' updating = False if os.path.isfile(filename): mode = 'r+b' updating = True print "File exists, adding If-Modified-Since header" modified_since = os.path.getmtime(filename) timestamp = datetime.datetime.utcfromtimestamp(modified_since) headers['If-Modified-Since'] = timestamp.strftime("%a, %d %b %Y %H:%M:%S GMT") try: with open(filename, mode) as f: key.get_contents_to_file(f, headers) f.truncate() except boto.exception.S3ResponseError as e: if not updating: # got an error and we are not updating an existing file # delete the file that was created due to mode = 'wb' os.remove(filename) return e.status return 200
ПРИМЕЧАНИЕ file.truncate
используется для обработки случая, когда новый файл меньше предыдущего.
- Настроить ведение журнала для внешних / сторонних библиотек
- Является ли хорошей идеей для меня изучать Python до C или другого языка компилятора?
- Как установить жизненный цикл объекта S3 с помощью boto?
- Можете ли вы перечислить все папки в ведро S3?
- Попытка boto3 повторить попытку многостраничных загрузок по умолчанию?
- Как создать ссылку на файл без истечения срока действия?
- Как загрузить данные в Amazon Redshift через Python Boto3?
- Как эффективно копировать все файлы из одного каталога в другой в ведро Amazon S3 с помощью boto?
- Как сделать s3 bucket общедоступным в python
- Как импортировать текстовый файл на AWS S3 в панды без записи на диск
- Как загрузить небольшие файлы в Amazon S3 эффективно в Python