深いディレクトリ構造を持つ s3 にバケットがあります。一度に全部ダウンロードできればいいのに。私のファイルは次のようになります:
foo/bar/1. .
foo/bar/100 . .
Python で boto lib を使用して s3 バケットからこれらのファイルを再帰的にダウンロードする方法はありますか?
前もって感謝します。
深いディレクトリ構造を持つ s3 にバケットがあります。一度に全部ダウンロードできればいいのに。私のファイルは次のようになります:
foo/bar/1. .
foo/bar/100 . .
Python で boto lib を使用して s3 バケットからこれらのファイルを再帰的にダウンロードする方法はありますか?
前もって感謝します。
次のようにバケット内のすべてのファイルをダウンロードできます (未テスト):
from boto.s3.connection import S3Connection
conn = S3Connection('your-access-key','your-secret-key')
bucket = conn.get_bucket('bucket')
for key in bucket.list():
try:
res = key.get_contents_to_filename(key.name)
except:
logging.info(key.name+":"+"FAILED")
S3 のフォルダーは、単にキー名を記述する別の方法であり、クライアントのみがこれをフォルダーとして表示することに注意してください。
フォルダーに 1000 個を超えるファイルがある場合は、ページネーターを使用してそれらを反復処理する必要があります
import boto3
import os
# create the client object
client = boto3.client(
's3',
aws_access_key_id= S3_ACCESS_KEY,
aws_secret_access_key= S3_SECRET_KEY
)
# bucket and folder urls
bucket= 'bucket-name'
data_key = 'key/to/data/'
paginator = client.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket=bucket, Prefix=data_dir):
for obj in page['Contents']:
key = obj['Key']
tmp_dir = '/'.join(key.split('/')[0:-1])
if not os.path.exists('/'.join(key.split('/')[0:-1])):
os.makedirs(tmp_dir)
else:
client.download_file(bucket, key, tmp_dir + key.split('/')[-1])