【问题标题】:Write to a specific folder in an S3 bucket using boto3 python使用 boto3 python 写入 S3 存储桶中的特定文件夹
【发布时间】:2021-09-16 23:16:41
【问题描述】:

问题

我有一个文件要写入我的 S3 存储桶中的特定文件夹,让我们调用存储桶 bucket 和文件夹 folderInBucket

我正在使用boto3库来实现并具有以下功能:

我做了什么

def upload_file(file_name, bucket, object_name = None):
    
    if object_name is None:
        object_name = file_name
    s3 = b3.client('s3')
    try:
        response = s3.upload_file(file_name, bucket, Key='bulk_movies.json')
    except ClientError as e:
        print(e)
        return False
    print('Success!')
    return True

upload_file('./s3/bulk_movies.json', 'bucket')

我在使用bucket/folderInBucket 作为第二个参数调用函数时也尝试过,但这会在代码中产生错误(实际上有点像预期的那样)

理解上的差距

这个函数或多或少是从 boto3 文档中删除的。文档并没有真正指定如何写入 S3 存储桶中的特定文件夹。我确信文件本身能够很好地写入存储桶的主目录,因为上面概述的代码可以正常工作。

【问题讨论】:

  • 这不是您问题的直接答案,但我建议您查看fsspec:filesystem-spec.readthedocs.io/en/latest/?badge=latest。例如,请参见此处:filesystem-spec.readthedocs.io/en/latest/…
  • 您能提供您遇到的错误吗?
  • 你正在传递Key,就像bulk_movies.json - 你的问题。我建议将Key 添加为函数的可配置参数。试试如果你传入Key='path/to/bulk_movies.json'会发生什么
  • 另外,可能相关,您正在分配 object_name 但没有在任何地方使用它

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

我可以通过修改你的函数和调用来让它工作,包括 object_name 作为存储桶上文件的绝对路径。

import boto3 as b3

def upload_file(file_name, bucket, object_name):
    if object_name is None:
        object_name = file_name
    s3 = b3.client('s3')
    try:
        response = s3.upload_file(file_name, bucket, Key=object_name)
    except ClientError as e:
        print(e)
        return False
    print('Success!')
    return True

upload_file('bulk_movies.json', '<bucket-name>', 'folderInBucket/bulk_movies.json')

如果您仍然遇到错误,请分享错误。就文件上传而言,它应该适用于您已经完成的工作。

【讨论】:

    【解决方案2】:

    S3 是“blob 存储”,因此“文件夹”的概念实际上并不存在。上传文件时,您只需为目标字符串提供完整的前缀。

    这是一个例子:

    import boto3
    
    s3 = boto3.resource('s3')
    folder_name = 'folder_name'
    s3.meta.client.upload_file('helloworld.txt', 'bucketname', folder_name + '/helloworld.txt')
    

    【讨论】:

      【解决方案3】:

      没有这样的东西 - “文件夹”是 s3。
      您认为“文件夹”是文件名的一部分。

      网址示例:s3://mybucket/folder1/folder2/file.txt

      在上面的例子中,文件名是'folder1/folder2/file.txt'

      【讨论】:

      • 更常用的术语是folder1/folder2/file.txt 是对象键(而不是文件名),folder1/folder2/ 是对象键前缀。
      【解决方案4】:

      存储桶不是文件夹,但它们的作用类似于文件夹。您将对象存储在 s3 存储桶中。一个对象有一个键。该文件默认以私有权限上传。您可以将 acl 设置为 public-read,让世界上的每个人都可以看到该文件。

      s3.upload_file(
          Bucket='gid-requests',
          Filename='bulk_movies.json',
          Key='folderInBucket/bulk_movies.json',
          ExtraArgs={'ACL':'public-read'})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-24
        • 2018-04-29
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多