我的代码正在运行。我面临的唯一问题是,我无法在S3存储桶中指定要放置文件的文件夹。这是我拥有的:
with open("/hadoop/prodtest/tips/ut/s3/test_audit_log.txt", "rb") as f:
s3.upload_fileobj(f, "us-east-1-tip-s3-stage", "BlueConnect/test_audit_log.txt")
答案 0 :(得分:0)
文件(“对象”)实际上是由它们的“键”(〜文件夹+文件名)存储在存储桶中的 flat 结构中。如果在键中放置斜杠(/
),则S3会向用户表示此斜杠,就好像它是文件夹结构的标记,但是这些文件夹实际上不存在于S3中,这只是为了方便起见,用户,并允许大多数文件系统熟悉的常规文件夹导航。
因此,按照您的代码所示,尽管看起来您正在将名为test_audit_log.txt
的文件放入名为BlueConnect
的文件夹中,但实际上您只是在{{ 1}}存储桶,其密钥为us-east-1-tip-s3-stage
。为了然后(似乎)将其放置在新文件夹中,只需将密钥设置为文件的完整路径即可,例如:
BlueConnect/test_audit_log.txt
在此示例中,对象的“键”为# upload_fileobj(file, bucket, key)
s3.upload_fileobj(f, "us-east-1-tip-s3-stage", "folder1/folder2/test_audit_log.txt")
,您可以将其视为文件夹folder1/folder2/test_audit_log.txt
中的文件 test_audit_log.txt
。位于文件夹folder1
内-这是它在S3上以文件夹结构显示的方式,通常与本地计算机的文件夹结构不同且独立。
答案 1 :(得分:0)
@danimal中的解释几乎捕获了所有内容。如果只想在s3中创建类似文件夹的对象,则只需指定该文件夹名称并以“ /”结尾,这样,当您从控制台查看它时,它将看起来像一个文件夹。
这是一个毫无用处的空对象,没有主体(将其视为具有null值的键)只是为了吸引人,但如果您确实想这样做,可以这样做。 1)您可以在控制台上以交互方式创建它,因为它提供了该选项 2_您可以使用aws sdk。 boto3具有s3客户端的put_object方法,您在其中将密钥指定为“ your_folder_name /”,请参见以下示例:
import boto3
session = boto3.Session() # I assume you know how to provide credentials etc.
s3 = session.client('s3', 'us-east-1')
bucket = s3.create_bucket('my-test-bucket')
response = s3.put_object(Bucket='my-test-bucket', Key='my_pretty_folder/' # note the ending "/"
那里有水桶。
同样,当您上传文件时,请指定“ my-test-bucket / my_file”,然后创建一个名称为“ my-test-bucket / my_file”的“ key ” ”,然后将文件内容作为其“ 值”。
在这种情况下,存储桶中有2个对象。第一个对象的主体为空,看起来像一个文件夹,而第二个对象看起来像在里面,但正如@danimal指出的那样,实际上您是在同一平面层次结构中创建了2个键,它只是“看起来像”我们使用的东西在文件系统中查看。
如果删除文件,则仍然有其他对象,因此在aws控制台上,看起来文件夹仍然存在,但内部没有文件。
如果您跳过创建文件夹的过程,只是像上次那样简单地上传文件,您仍然会在AWS Console中看到文件夹结构,但是此时只有一个对象。
但是,当您从命令行列出对象时,您会看到一个对象,如果在控制台上将其删除,则好像文件夹也消失了。