如何使用python上传S3空的子文件夹

时间:2017-11-15 03:20:39

标签: python amazon-web-services boto3

以下代码工作正常,除非有子文件夹,里面没有任何文件,那么子文件夹将不会出现在S3中。例如 如果/ home / temp /子文件夹没有文件,则子文件夹将不会显示在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/

感谢他们分享代码。

1 个答案:

答案 0 :(得分:9)

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