【问题标题】:how to upload sub-folder which is empty to S3 using python如何使用python将空的子文件夹上传到S3
【发布时间】:2018-04-28 04:04:38
【问题描述】:

以下代码可以正常工作,除非有一个子文件夹,其中没有任何文件,那么该子文件夹将不会出现在 S3 中。例如 如果 /home/temp/subfolder 没有文件,则子文件夹将不会显示在 S3 中。如何更改代码以便在 S3 中也上传空文件夹? 我试着写某事。 (见下面的注释),但不知道如何调用 put_object() 到空子文件夹。

#!/usr/bin/env python
import os
from boto3.session import Session

path = "/home/temp"
session = Session(aws_access_key_id='XXX', aws_secret_access_key='XXX')
s3 = session.resource('s3')

for subdir, dirs, files in os.walk(path):
    # note: if not files ......
    for file in files:
        full_path = os.path.join(subdir, file)
        with open(full_path, 'rb') as data:

s3.Bucket('my_bucket').put_object(Key=full_path[len(path)+1:],    
Body=data)

此外,我尝试调用此函数来检查子文件夹或文件是否存在。它适用于文件,但不适用于子文件夹。如何检查子文件夹是否存在? (如果有子文件夹我就不上传了)

def check_exist(s3, bucket, key):
    try:
        s3.Object(bucket, key).load()
    except botocore.exceptions.ClientError as e:
        return False
    return True

顺便说一句,我参考了上面的代码

check if a key exists in a bucket in s3 using boto3

http://www.developerfiles.com/upload-files-to-s3-with-python-keeping-the-original-folder-structure/

感谢他们分享代码。

【问题讨论】:

  • 这个问题与AWS S3基本很多次有关:S3是一个对象存储,所有对象名称实际上是一个键名,它不支持文件夹。您使用 AWS 控制台看到的只是任意的。这就是为什么 S3 使用称为“PREFIX”的东西来过滤掉具有相似前缀的对象名称的原因。这是让用户像文件夹一样系统地组织和过滤对象的唯一方法。

标签: python amazon-web-services boto3


【解决方案1】:

S3 中不存在目录(文件夹、子文件夹等)。

当您将此文件复制到空的 S3 存储桶 /mydir/myfile.txt 时,只有文件 myfile.txt 会复制到 S3。未创建目录mydir,因为该字符串是文件名mydir/myfile.txt 的一部分。实际文件名是完整路径,不存在或创建子目录。

S3 在列出存储桶中的文件时使用前缀来模拟目录。如果您指定mydir/,则将返回所有以mydir/ 开头的S3 对象,包括mydir/anotherfolder/myotherfile.txt 等对象。 S3 支持/ 等分隔符,以便创建子目录的外观。

注意:S3 对象的文件名开头没有/

Listing Keys Hierarchically Using a Prefix and Delimiter

【讨论】:

  • 谢谢约翰。那么有没有办法上传一个空的子文件夹呢?我只想将包括其结构的整个目录上传到 S3 以进行备份。奇怪的是S3没有这种备份机制。看来我必须在本地压缩整个目录,然后将单个压缩文件上传到 S3。
  • S3 上不存在目录,因此您无法上传空目录。注意:一些软件产品在 S3 (CloudBerry) 中创建模拟目录条目。这些实际上只是 0 长度的文件。如果您想使用 S3 作为本地文件系统的备份克隆,您会遇到问题,因为 S3 不是文件系统而是键值存储。创建一个 zip 文件,然后上传该 zip 文件是一种可行的方法。
  • @user389955 S3 不是分层的。文件不是“在”文件夹中——这也是 S3 可以扩展到本质上无限数量的对象而性能没有变化的部分原因。如果您真的希望能够在 S3 中“找到”一个文件夹,您可以上传一个名称以 / 结尾的空对象,但这只是一种错觉,并没有告诉您它是否“里面”有任何东西(并且通过 API 删除它不会删除其中的文件)。
  • 如果你使用 EFS 会发生这样的事情吗?或者是完全不同的东西
  • 您有问题吗,EFS 中可以有空文件夹吗?答案是肯定的。 EFS 是一个文件系统,而 S3 是一个平面键/值存储设备。将 S3 视为只有一个目录(根目录)。所有文件,无论其路径名如何,都存储在根目录中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2019-07-30
  • 1970-01-01
  • 2013-02-11
  • 2017-10-18
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多