以下代码工作正常,除非有子文件夹,里面没有任何文件,那么子文件夹将不会出现在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/
感谢他们分享代码。
答案 0 :(得分:9)
S3中不存在目录(文件夹,子文件夹等)。
将此文件复制到空S3存储桶/mydir/myfile.txt
时,只会将文件myfile.txt
复制到S3。未创建目录mydir
,因为该字符串是文件名mydir/myfile.txt
的一部分。实际文件名是完整路径,不存在或创建子目录。
S3在列表中列出文件时使用前缀模拟目录。如果指定mydir/
,则将返回以mydir/
开头的所有S3对象,包括mydir/anotherfolder/myotherfile.txt
等对象。 S3支持/
等分隔符,以便可以创建子目录的外观。
注意:S3对象的文件名开头没有/
。