
[英]How to download Amazon S3 files on to local machine in folder using python and boto3?
[英]Move files between folder on Amazon S3 using boto3
在处理完每个文件后,我试图将文件从一个文件夹移动到同一个存储桶中的另一个文件夹。 我在 EC2 实例上运行这个 python3 脚本。
import os.path
from boto3.session import Session
ACCESS_KEY = 'XXXXXXXXXXXXXXXX'
SECRET_KEY = 'YYYYYYYYYYYYYYYYYY'
BUCKET_NAME = 'test-s3logs'
MAX_FILES_READ = 10
SOURCE_PREFIX = 'logs/'
DESTINATION_PREFIX = 'processed/'
words = ['London', 'user/xxxx']
if __name__ == "__main__":
# Use Boto to connect to S3 and get a list of objects from a bucket
session = Session(aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
# call S3 to list current buckets
source_bucket = s3.Bucket(BUCKET_NAME)
dest_bucket = s3.Bucket(BUCKET_NAME)
index = 0
for s3_file in source_bucket.objects.filter(Prefix=SOURCE_PREFIX):
index += 1
if index == MAX_FILES_READ:
break
found_get_record = False
source_obj = s3.Object(BUCKET_NAME, s3_file.key)
for line in source_obj.get()['Body']._raw_stream:
line_found = line.decode('utf-8')
if all(word in line_found for word in words):
found_get_record = True
# insert record in database
print ('insert into db')
if found_get_record:
# move the file to processed folder
print ('moving file: {}', format(s3_file.key))
old_source = { 'Bucket': BUCKET_NAME,'Key': s3_file.key}
dest_obj = dest_bucket.Object(s3_file.key.replace(SOURCE_PREFIX, DESTINATION_PREFIX, 1))
dest_obj.copy(old_source)
source_obj.delete()
else:
# delete file.
print ('deleting file: {}', format(s3_file.key))
source_obj.delete()
逻辑:
“logs”文件夹填充了来自不同进程的日志文件。
该脚本定期检查“日志”文件夹并打开它进行阅读,检查某些关键字。 如果找到,则将一些详细信息插入 DB 并将文件移至“已处理”文件夹。 如果未找到关键字,则简单地删除日志文件。
题:
当没有剩余的日志文件时,脚本也会删除“日志”文件夹。 怎么阻止?
我已经尽力了脚本。 有没有办法清理这个?
否则,它运行良好。
文件夹实际上并不存在于 Amazon S3 中。
例如,您可以创建一个名为invoices/foo.txt
的对象,即使没有invoices
文件夹,它也能正常工作。 invoices
文件夹会神奇地出现在控制台中,并且当里面没有更多对象时也会神奇地消失。
因此,一种选择是根本不用担心文件夹。
如果您确实在 S3 管理控制台中创建了一个文件夹,则会创建一个长度为零的对象,其密钥等于文件夹的名称。 这会强制出现一个空文件夹,即使它实际上并不存在。
为了防止“文件夹”被删除,只需不要删除与文件夹同名的零长度对象。 您的代码可以检查对象的长度,或者检查其 Key 是否与文件夹名称(及其完整路径)匹配。 如果是这样,请不要删除它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.