我在s3中有一个名为“样本数据”的桶。在桶里,我有标签为"A“到"Z”的文件夹。
在每个字母文件夹中有更多的文件和文件夹。下载字母文件夹和所有内容的最快方法是什么?
例如-> sample-data/a/foo.txt,more_files/foo1.txt
在上面的示例中,桶sample-data包含一个名为a的文件夹,其中包含foo.txt,还有一个名为more_files的文件夹,其中包含foo1.txt。
我知道如何下载一个文件。例如,如果我想要foo.txt,我将执行以下操作。
s3 = boto3.client('s3')
s3.download_file("sample-data", "a/foo.txt", "foo.txt")但是,我想知道是否可以下载名为a的文件夹以及它的全部内容?任何帮助都将不胜感激。
发布于 2020-10-06 17:03:22
我想你最好的选择是awscli
aws s3 cp --recursive s3://mybucket/your_folder_named_a path/to/your/destination从医生那里:
-对指定目录或前缀下的所有文件或对象执行递归(布尔)命令。
编辑:
要使用boto3执行此操作,请尝试如下:
import os
import errno
import boto3
client = boto3.client('s3')
def assert_dir_exists(path):
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
def download_dir(bucket, path, target):
# Handle missing / at end of prefix
if not path.endswith('/'):
path += '/'
paginator = client.get_paginator('list_objects_v2')
for result in paginator.paginate(Bucket=bucket, Prefix=path):
# Download each file individually
for key in result['Contents']:
# Calculate relative path
rel_path = key['Key'][len(path):]
# Skip paths ending in /
if not key['Key'].endswith('/'):
local_file_path = os.path.join(target, rel_path)
# Make sure directories exist
local_file_dir = os.path.dirname(local_file_path)
assert_dir_exists(local_file_dir)
client.download_file(bucket, key['Key'], local_file_path)
download_dir('your_bucket', 'your_folder', 'destination')https://stackoverflow.com/questions/64226700
复制相似问题