所以,在任何人告诉我有关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()
您的upload_files()
功能正在上传到:
bucket.put_object(Key=bucketFolderName, Body=data)
这意味着S3上的文件名("键")将是'文件夹'的名称。应该是:
bucket.put_object(Key=bucketFolderName + '/' + file, Body=data)
关键是目标对象的完整路径,包括文件名(不仅是'目录')。
实际上,无需事先创建"文件夹" - 只需上传到所需的密钥。
如果您感到懒惰,请使用AWS命令行界面(CLI)aws s3 sync
命令为您执行!
"事实是您可以在S3中创建'文件夹'
不,你不能。
您可以创建一个看起来像控制台中一个文件夹的空对象,但它仍然不是文件夹,它仍然没有意义,它仍然是不必要的,如果您通过API删除它,则所有文件思想是"在"文件夹中仍将在存储桶中。(如果将其从控制台中删除,则所有内容均从存储桶中删除,因为控制台明确删除了从该密钥前缀开始的每个对象。)
您要创建的文件夹不是容器,并且内部没有任何内容,因为S3没有容器的文件夹。
如果我想存储一个文件cat.png
并使其看起来像在hat/
文件夹中,则只需将对象键设置为hat/cat.png
即可。这与控制台中观察到的效果完全相同,无论是否明确创建了hat/
文件夹。
这样,您只需使用字符串操纵为每个对象构建所需的对象键,包括您的常见前缀("文件夹名称")和/
定界器。任何文件夹结构/
定销仪暗示将显示在控制台中。