Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 新S3和x27下的Boto3文件夹同步;文件夹';_Python_Amazon S3_Boto3 - Fatal编程技术网

Python 新S3和x27下的Boto3文件夹同步;文件夹';

Python 新S3和x27下的Boto3文件夹同步;文件夹';,python,amazon-s3,boto3,Python,Amazon S3,Boto3,所以,在有人告诉我S3的平面结构之前,我已经知道了,但事实是你可以在S3中创建“文件夹”。我使用此Python代码的目标是使用运行日期创建一个名为的新文件夹,并将用户的输入附加到此文件夹(这是createS3Folder函数)——然后我希望将本地目录中的文件夹同步到此文件夹 问题是,我的upload_files函数在S3中创建了一个新文件夹,它完全模拟本地设置的文件夹结构 有谁能建议我如何在不更改名称的情况下将文件夹同步到新创建的文件夹中 import sys import boto3 impo

所以,在有人告诉我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()
“事实上,您可以在S3中创建“文件夹”

不,你不能

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

您正在创建的文件夹不是容器,里面不能有任何内容,因为S3没有容器文件夹

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

为此,只需通过字符串操作为每个对象构建所需的对象键,包括公共前缀(“文件夹名称”)和分隔符。因此,
/
分隔符表示的任何文件夹结构都将显示在控制台中

“事实上,您可以在S3中创建“文件夹”

不,你不能

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

您正在创建的文件夹不是容器,里面不能有任何内容,因为S3没有容器文件夹

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

为此,只需通过字符串操作为每个对象构建所需的对象键,包括公共前缀(“文件夹名称”)和分隔符。因此,
/
分隔符表示的任何文件夹结构都将显示在控制台中。

您的
上载文件()
功能正在上载到:

bucket.put_object(Key=bucketFolderName, Body=data)
这意味着S3上的文件名(“键”)将是“文件夹”的名称。应该是:

 bucket.put_object(Key=bucketFolderName + '/' + file, Body=data)
键是目标对象的完整路径,包括文件名(而不仅仅是“目录”)

事实上,不需要事先创建“文件夹”——只需上传到所需的密钥即可

如果您感到懒惰,请使用
aws s3 sync
命令执行此操作

您的
upload_files()
函数正在上载到:

bucket.put_object(Key=bucketFolderName, Body=data)
这意味着S3上的文件名(“键”)将是“文件夹”的名称。应该是:

 bucket.put_object(Key=bucketFolderName + '/' + file, Body=data)
键是目标对象的完整路径,包括文件名(而不仅仅是“目录”)

事实上,不需要事先创建“文件夹”——只需上传到所需的密钥即可


如果您感到懒惰,请使用
aws s3 sync
命令执行此操作

我完全精通AWS,并且完全理解S3的概念。虽然我知道这些是对象(对CLI和Boto3的任何熟悉都会让AWS的初学者非常清楚),但从概念上讲,这些对象就像文件夹一样工作,因此称为“分隔符”:分隔符是一个由一个或多个字符组成的序列,用于指定不同对象之间的边界,纯文本或其他数据流中的独立区域。分隔符的一个例子是逗号字符,它在一系列以逗号分隔的值中充当字段分隔符。只是人们很难理解这个概念。文件夹在S3中的存在方式与文件夹在文件系统中的存在方式不同。执行以下操作:1)创建一个名为TEST/2)上载一个路径为TEST/TESTFILE.TXT的文件3)将对象TEST/重命名为OTHER/。现在请注意,您有两个文件夹“TEST/”和“OTHER/”,文件TESTFILE.TXT现在位于“OTHER/”中。大多数人会认为重命名目录也会将子文件带进。我完全精通AWS,并且完全理解S3 bucket的概念。虽然我知道这些是对象(对CLI和Boto3的任何熟悉都会让AWS的初学者非常清楚),但从概念上讲,这些对象就像文件夹一样工作,因此称为“分隔符”:分隔符是一个由一个或多个字符组成的序列,用于指定不同对象之间的边界,纯文本或其他数据流中的独立区域。分隔符的一个例子是逗号字符,它在一系列以逗号分隔的值中充当字段分隔符。只是人们很难理解这个概念。文件夹在S3中的存在方式与文件夹在文件系统中的存在方式不同。执行以下操作:1)创建一个名为TEST/2)上载一个路径为TEST/TESTFILE.TXT的文件3)将对象TEST/重命名为OTHER/。现在请注意,您有两个