繁体   English   中英

Python在不知道密钥名称的情况下下载S3文件

[英]Python Downloading an S3 file without knowing key name

我正在编写一个Python脚本,通过Athena运行查询,将其输出到S3并将其下载到我的计算机中。 我能够通过Athena运行我的查询并将结果输出到S3。 所以我的下一步似乎无法弄清楚如何在不知道密钥名称的情况下将其下载到我的计算机上?

在将其输出到Athena后,有没有办法在我的python脚本中查找对象键?
我完成了什么:

# Output location and DB
s3_output = ‘s3_output_here’
database = ‘database_here’

# Function to run Athena query
def run_query(query, database, s3_output):
    while True:
        try:
            response = client.start_query_execution(
                QueryString=query,
                QueryExecutionContext={
                    'Database': database
                    },
                ResultConfiguration={
                    'OutputLocation': s3_output,
                    }
                )
            return response
            break
        except client.exceptions.TooManyRequestsException as e:
            print('Too many requests, trying again after sleep')
            time.sleep(100)

# Our SQL Query    
query = """
SELECT *
FROM test
”””

print("Running query to Athena...")
res = run_query(query, database, s3_output)

我知道如何使用以下代码下载文件:

try:
    s3.Bucket(BUCKET_NAME).download_file(KEY, ‘KEY_HERE’)
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == "404":
        print("The object does not exist.")
    else:
        raise

那么在运行我的第一个完成的代码后如何读取密钥名称?

您可以使用boto库提供的get_key命令获取密钥。 这是我从s3下载的东西:

    with open("path/aws-credentials.json") as f:
        data= json.load(f)
        conn = boto.connect_s3(data["accessKeyId"], data["secretAccessKey"])
    bucket = conn.get_bucket('your_bucket')
    file_path = bucket.get_key('path/to/s3/file')
    file_path.get_contents_to_filename('path/on/local/computer/filename')

如果您只是在测试某些内容,则可以将您的凭据硬编码到代码中,但如果您计划将其投入生产,则最好将您的凭据存储在外部,例如json文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM