新的S3'文件夹下的Boto3文件夹同步

时间:2017-12-07 12:50:34

标签: python amazon-s3 boto3

所以,在任何人告诉我S3的扁平结构之前,我已经知道了,但事实是你可以在S3中创建'文件夹'。我对这个Python代码的目标是创建一个使用运行日期命名的新文件夹,并将用户的输入附加到此(这是createS3Folder函数) - 然后我想将本地目录中的文件夹同步到此文件夹。

问题是我的upload_files函数在S3中创建了一个新文件夹,它完全模拟了我本地设置的文件夹结构。

有人可以建议我如何在不更改名称的情况下将文件夹同步到新创建的文件夹中吗?

import sys
import boto3
import datetime
import os

teamName = raw_input("Please enter the name of your project: ")
bucketFolderName = ""

def createS3Folder():
    date = datetime.date.today().strftime("%Y") + "." + 
    datetime.date.today().strftime("%B") + "." + 
    datetime.date.today().strftime("%d")
    date1 = datetime.date.today()
    date = str(date1) + "/" #In order to generate a file, you must 
    put "/" at the end of key
    bucketFolderName = date + teamName + "/"  
    client = boto3.client('s3')
    client.put_object(Bucket='MY_BUCKET',Key=bucketFolderName)  
    upload_files('/Users/local/directory/to/sync')

def upload_files(path):
    session = boto3.Session()
    s3 = session.resource('s3')
    bucket = s3.Bucket('MY_BUCKET')
    for subdir, dirs, files in os.walk(path):
        for file in files:
            full_path = os.path.join(subdir, file)
            with open(full_path, 'rb') as data:
                bucket.put_object(Key=bucketFolderName, Body=data)

def main():
    createS3Folder()

if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:4)

您的upload_files()功能正在上传到:

bucket.put_object(Key=bucketFolderName, Body=data)

这意味着S3上的文件名(“Key”)将是“文件夹”的名称。它应该是:

 bucket.put_object(Key=bucketFolderName + '/' + file, Body=data)

Key是目标对象的完整路径,包括文件名(不仅仅是'目录')。

事实上,没有必要事先创建'文件夹' - 只需上传到所需的密钥。

如果您感到懒惰,请使用AWS Command-Line Interface (CLI) aws s3 sync命令为您执行此操作!

答案 1 :(得分:2)

  

"事实是你可以创建'文件夹'在S3"

不,你不能。

您可以在控制台中创建一个看起来像文件夹的空对象,但它仍然不是文件夹,它仍然没有意义,它仍然是不必要的,如果您通过API删除它,所有文件你思想是"在"该文件夹仍将在存储桶中。 (如果从控制台中删除它,则会从存储桶中删除所有内容,因为控制台会显式删除以该键前缀开头的每个对象。)

您正在创建的文件夹不是容器,并且其中没有任何内容,因为S3没有容器文件夹。

如果我想存储文件cat.png并使其显示在hat/文件夹中,您只需将对象键设置为hat/cat.png即可。这与在控制台中观察到的效果完全相同,无论是否显式创建了hat/文件夹。

按照您的要求,您只需使用字符串操作为每个对象构建所需的对象键,包括您的公共前缀("文件夹名称")和/分隔符。因此,/分隔符隐含的任何文件夹结构都将显示在控制台中。