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]系统找不到指定的文件
答案 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中的命令,则将“调用”。