我可以通过AWS账户和应用程序使用Boto3成本资源管理器获取结算金额。结果我得到了一个json响应。目前,我正在将json转换为csv文件并将其存储在本地计算机上。一切都很好。
但是,我想在S3中直接使用csv文件。就像在S3中创建一个csv文件一样,创建头文件并将内容从json复制到csv。是否可以使用s3.Object?
执行此操作我想尝试使用这样的东西:
bucket = s3.Bucket('my-bucket')
header = 'Account Number;Application;Amount\n'
with open('test.csv', 'wt') as file_object:
file_object.write(header)
我没有收到任何错误,但也没有结果。
更新了问题 - 这就是我将json转换为csv以获取我需要的列的方式:
import boto3
import json
import csv
import yaml
client = boto3.client('ce',
region_name='us-east-1',
aws_access_key_id='AWS Access Key',
aws_secret_access_key='AWS Secret Access Key')
response = client.get_cost_and_usage(
TimePeriod={
'Start': '2018-01-01',
'End': '2018-02-01'
},
Granularity='MONTHLY',
Metrics=[
'BlendedCost',
],
GroupBy=[
{
'Type': 'DIMENSION',
'Key': 'LINKED_ACCOUNT'
},
{
'Type': 'TAG',
'Key': 'Application'
},
],
)
response_ser = json.dumps(response)
# decode the unicode strings without converting the datatype
decode_response = yaml.safe_load(response_ser)
# get the first object in the response json
results_obj = decode_response['ResultsByTime']
results_dict = results_obj[0]
#get the groups
response_groups = results_dict['Groups']
raw_data = open(local_file, "w")
csvwriter = csv.writer(raw_data)
fieldnames = ['Account Number', 'Application', 'Amount']
writer = csv.DictWriter(raw_data, fieldnames=fieldnames)
writer.writeheader()
for i in response_groups:
accountNumber = i['Keys'][0]
application = i['Keys'][1]
amount = i['Metrics']['BlendedCost']['Amount']
writer.writerow({'Account Number': accountNumber, 'Application':
application, 'Amount': amount})
raw_data.close()
因此,我不想在本地计算机上创建csv文件,而是希望在S3中创建它。我能够使用正确的密钥连接到S3存储桶,并可以将文件从我的机器上传到S3。但是,当我尝试在S3中创建文件时,它不起作用。我在这里做错了吗?
答案 0 :(得分:1)
pip install smart_open
>>> # stream content *into* S3 (write mode):
>>> with smart_open.smart_open('s3://mybucket/mykey.txt', 'wb') as fout:
... for line in ['first line', 'second line', 'third line']:
... fout.write(line + '\n')
答案 1 :(得分:1)
不确定您的问题,但请尝试像这样的Dictreader
with open(full_output_path, 'wb') as f:
fields = ['email', 'lastname', 'firstname', 'groups']
w = csv.DictWriter(f, fields)
w.writeheader()
w.writerow(row_data)
答案 2 :(得分:0)
嘿所以我有很多使用boto3的经验。您绝对可以直接将ssv写入s3,但它使用boto3 s3客户端而不是资源或对象。从我对你的问题的了解,你想获得json输出并将其转换为csv文件,将其存储在s3而不是本地计算机上。您可以使用通常在本地文件中创建的数据来执行此操作,但它可能是这样的:
client = boto3.client('s3')
variable = b'csv, output, from, json' # need bytes here or a file path
response = client.put_object(Bucket='bucket-name',Body=variable,Key='filenameyouwant.csv')
此外,我不确定您是否要附加结果或覆盖,但您可以使用get_object动态地将csv文件数据添加到现有s3对象。这将允许您读取流,附加新数据,然后您可以重新上传所有数据,而无需写入本地硬盘。
请告诉我这是否回答了您的问题
请参阅以下文档: put_object