提取文件夹中的最新文件并上传到s3?

时间:2019-09-14 14:22:54

标签: python amazon-s3 boto3

filename变量用于获取最新文件的名称 我的目的是监视一个文件夹,每当检索到新文件时,便使用boto3将其自动上传到s3存储桶。

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from subprocess 
import call
import os
import boto3

session = boto3.Session(aws_access_key_id ='aws_access_key_id',aws_secret_access_key ='aws_secret_access_key',                                 region_name ='region_name')

s3 = session.client('s3')

class Watcher:
    def __init__(self):
        self.dir = os.path.abspath('D:\\project')
        self.observer = Observer()

    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler, self.dir, recursive=True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Error")

        self.observer.join()   

    class Handler(FileSystemEventHandler):
        @staticmethod
        def on_any_event(event):
            if event.is_directory:
                return None

        elif event.event_type == 'created':
        print("Received created event - %s." % event.src_path)
        s3.upload_file(Filename=event.src_path, bucket='bucketname, key=test-file-1)

if __name__ == '__main__':
    w = Watcher()
    w.run()

FileNotFoundError:[WinError 2]系统找不到指定的文件

2 个答案:

答案 0 :(得分:0)

不确定是否要这样做来学习python(boto3)。如果是这样,恭喜您。 如果不是,则AWS已经提供了此类feature。因此,您可以将所有内容保留在代码中,但可以使用AWS CLI。

答案 1 :(得分:0)

正如评论中提到的@alexhall一样,s3.meta.client.upload_file方法将上传文件。您可以在https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_file上阅读有关boto3 s3客户端上传方法文档的信息。但是,这是一个愚蠢的示例,因为它们首先创建的是s3资源而不是s3客户端,然后由于s3资源实际上没有上传文件的方法,因此它们又还原为s3客户端。您最好直接创建并使用s3客户端进行上传。

您还依赖这样的事实,即在创建s3资源时,boto3使用默认会话,就像您所做的那样:

boto3.resource('s3')

如果您在lambda上运行代码,或者您处于配置了IAM角色以访问s3的ec2实例中,但我认为您是在AWS外部运行此代码,则可以首先使用您的凭据创建一个boto3.Session(),然后客户端(或资源)可以使用该会话。

aws_access_key_id = '<AWS_ACCESS_KEY_ID>'
aws_secret_access_key = '<AWS_SECRET_ACCESS_KEY>'
region_name = 'us-east-1'

session = boto3.Session(aws_access_key_id=aws_access_key_id,
                                aws_secret_access_key=aws_secret_access_key,
                                region_name=region_name)

s3 = session.client('s3')

您可以在此处阅读有关会话配置的信息:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html

如上所述,由于您正在尝试上传文件,并且似乎没有对其进行任何其他操作,因此您最好直接创建s3客户端而不是像以前那样创建s3资源,然后使用“ meta.client”。

代替command = ...行,只需使用:

s3.upload_file(Filename, Bucket = 'aaaaa', Key='test-file-1')

您可以删除最后一行。如果您正在运行OS / System命令而不是python中的命令,则将“调用”。