使用d6tpipe从AWS S3下载目录如何配置参数及解决报错
问题解答
1. S3配置字段对应规则
你给出的S3路径结构为s3://<桶名>/<对象前缀>,对应配置项的两个字段填写规则如下:
name:为本地管道的自定义标识,你当前填写的folder_of_interest完全可用,仅需保证本地唯一即可,无需修改。location:需填入完整的S3资源路径,即你现有的s3://parent_filepath/foo/bar/folder_of_interest/。
2. 报错修复方案
你遇到的AttributeError报错是因为当前安装的d6tpipe版本较新,旧版本的create_pipe_with_remote接口已被移除,有两种解决方式可选:
方案1:回退d6tpipe到兼容版本
执行命令安装旧版本d6tpipe,即可直接运行你现有代码:
pip install d6tpipe==0.2.5
方案2:使用AWS官方boto3库实现(更稳定,推荐)
d6tpipe属于第三方封装库,版本迭代兼容性较差,直接使用官方boto3库实现递归下载更稳妥,操作步骤如下:
- 安装boto3:
pip install boto3
- 使用以下代码实现S3文件夹递归下载,直接填入你的凭证即可运行:
import boto3 import os # 初始化S3客户端 s3_client = boto3.client( 's3', aws_access_key_id='替换为你的AWS Access Key ID', aws_secret_access_key='替换为你的AWS Secret Access Key' ) # 资源配置 bucket_name = 'parent_filepath' s3_folder_prefix = 'foo/bar/folder_of_interest/' local_save_path = './s3_downloads/' # 创建本地存储目录 os.makedirs(local_save_path, exist_ok=True) # 递归下载函数 def recursive_download_s3(bucket, prefix, local_dir): paginator = s3_client.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=bucket, Prefix=prefix): if 'Contents' not in page: return for obj in page['Contents']: # 跳过S3的空文件夹标记 if obj['Key'].endswith('/'): continue # 计算本地文件相对路径 relative_file_path = obj['Key'][len(prefix):] local_file_full_path = os.path.join(local_dir, relative_file_path) # 生成本地子目录 os.makedirs(os.path.dirname(local_file_full_path), exist_ok=True) # 下载文件 s3_client.download_file(bucket, obj['Key'], local_file_full_path) # 执行下载 recursive_download_s3(bucket_name, s3_folder_prefix, local_save_path) print("S3文件夹递归下载完成")
内容的提问来源于stack exchange,提问作者user16341274
相关产品推荐
相关产品推荐

