当前位置: 首页 > 知识库问答 >
问题:

获取文件夹中的最新文件并上载到s3?

拓拔泉
2023-03-14

filename变量用于获取最新文件的名称。我的目标是监视文件夹,每当检索到新文件时,使用boto3自动将其上载到s3 bucket。

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

会话=BOT3。会话(aws\u access\u key\u id='aws\u access\u key\u id',aws\u secret\u access\u key='aws\u secret\u access\u key',region\u name='region\u name')

s3=会话。客户端(“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个答案

乐正明辉
2023-03-14

不确定您这样做是否是为了学习python(boto3)。如果是,恭喜。如果不是,AWS已经提供了这样的功能。所以你把所有的东西都保留在代码中,但要向AWS CLI付费。

顾琛
2023-03-14

正如@alexhall在评论中提到的,s3。元。客户upload\u file方法将上载文件。您可以在此处阅读boto3 s3客户端的上载方法文档:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_file.然而,这是一个有点愚蠢的例子,因为他们首先创建一个s3资源而不是s3客户端,然后因为s3资源实际上没有上载文件的方法,所以他们返回到s3客户端。您也可以直接创建并使用s3客户端进行上传。

您还依赖于这样一个事实,即当您像以前那样创建s3资源时,boto3使用默认会话:

boto3.resource('s3')

如果您在lambda上运行代码,或者如果您在ec2实例中配置了IAM角色以访问s3,那么这将很好,但我认为您是在AWS之外运行此代码,在这种情况下,您可以使用boto3。首先使用凭据创建会话(),然后客户端(或资源)可以使用该会话。

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.upload_file(Filename, Bucket = 'aaaaa', Key='test-file-1')

您可以删除最后一行。如果您运行的是OS/System命令而不是python中的某个东西,您会“调用”。

 类似资料:
  • 我有一个带有文件输入字段的表单: 然后我做的东西与此图像文件提交: 我要保存图像的目录名为,与上面的目录相同。 您可能会注意到,在上面我在类insertBlog`的代码是: 当用户填写表单时,除了图像信息之外,它还将所有其他信息正确地存储在MySQL表中。此外,它不会将实际图像存储在文件夹中。那么,如何让这个脚本将图像上传到文件夹,并将其路径存储在mysql表中呢。目前,它没有将图像存储在数据库中

  • 问题内容: 我正在尝试编写脚本以从Python中FTP服务器的最新子目录获取最新文件。我的问题是我无法找出最新的子目录。有两个选项可用,子目录具有ctime可用。在目录名称中还提到了日期,即在哪个日期创建了目录。但是我不知道如何获取最新目录的名称。我想出了以下方法(希望服务器端按最新的ctime排序)。我已经按照以下方式进行了操作,如果第一个对象是最新目录,它将可以正常工作。 但是,有什么方法可以

  • 问题内容: 我编写了一些代码,这些代码将搜索目录并在列表框中显示文件。 我什至尝试过: 我虽然出错了… 好的,它说的Users\Hunter很好,当人们获得我的软件时,名字就没有猎人了。那么,我该如何将其命名为任何用户的下载文件夹? 问题答案: WinAPI方法SHGetKnownFolderPath是检索特殊文件夹(包括个人文件夹和下载文件夹)路径的唯一正确方法。 还有其他方法可以获得相似的结果

  • 问题内容: 我在文档文件夹中获取文件名的代码有什么问题? 我以为我已正确阅读了文档,并且我对documents文件夹中的内容非常确定,但是“ fileList”没有显示任何内容?“目录”显示文件夹的路径。 问题答案: 此解决方案适用于 Swift 4 (Xcode 9.2)和 Swift 5 (Xcode 10.2.1+): 这是一个可重用的FileManager扩展,它还允许您跳过或在结果中包含

  • 问题 你想获取文件系统中某个目录下的所有文件列表。 解决方案 使用 os.listdir() 函数来获取某个目录中的文件列表: import os names = os.listdir('somedir') 结果会返回目录中所有文件列表,包括所有文件,子目录,符号链接等等。 如果你需要通过某种方式过滤数据,可以考虑结合 os.path 库中的一些函数来使用列表推导。比如: import os.pa

  • 在Python中,我应该使用什么命令来获取包含我正在处理的文件的文件夹的名称? 这里就是我想要得到的。 我唯一想到的是使用两次: 还有更好的方法吗?