【发布时间】: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