Python在不知道键名的情况下下载S3文件

时间:2018-11-30 18:43:42

标签: python amazon-athena

我正在编写一个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

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

1 个答案:

答案 0 :(得分:2)

您可以使用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文件之类的外部。