Добавить в CSV или создать новый лист в том же CSV - PullRequest
0 голосов
/ 25 сентября 2019

Подлинник состоит из двух частей.Выборка групп безопасности учетной записи A и учетной записи B. Когда он пишет в CSV, он сначала записывает группы безопасности учетной записи A, а затем перезаписывает тот же CSV с группами безопасности учетной записи B. Поэтому, когда я загружаю файл, он содержит толькорезультаты из учетной записи B.

Мне нужно решение, чтобы добавить группы безопасности B на один лист, или создать новый лист для учетной записи B в том же CSV.Пожалуйста, объясните мне, как этого добиться.

Спасибо за чтение.

import boto3
import csv
import io
from io import BytesIO
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart

a_dev_client = boto3.client('ec2', region_name='eu-west-1')

def lambda_handler(event, context): 

    sts = boto3.client('sts')
    b_dev = sts.assume_role(
        RoleArn='arn:aws:iam::2222222222222:role/Unused_Security_Groups',
        RoleSessionName='test'
    )

    b_dev_client = boto3.resource(
        'ec2',
        region_name='eu-west-1',
        aws_access_key_id=b_dev["Credentials"]["AccessKeyId"],
        aws_secret_access_key=b_dev["Credentials"]["SecretAccessKey"],
        aws_session_token=b_dev["Credentials"]["SessionToken"]
    )

    def a_dev():
        Account_Name = 'A'
        regions = ['eu-west-1','eu-west-2','us-east-2','us-west-1','us-west-2','us-east-1','ap-northeast-2','ap-southeast-1','ap-southeast-2','ap-northeast-1','ca-central-1','eu-west-3']
        csvio = io.BytesIO()
        writer = csv.writer(csvio)
        writer.writerow([
            'Account Name',
            'Region',
            'SecurityGroup-Id'
        ])
        for region in regions:
            ec2 = boto3.resource('ec2', region_name=region)
            sgs = list(ec2.security_groups.all())
            insts = list(ec2.instances.all())
            all_sgs = set([sg.group_id for sg in sgs])
            all_inst_sgs = set([sg['GroupId'] for inst in insts for sg in
            inst.security_groups])
            unused_sgs = all_sgs - all_inst_sgs
            for elem in unused_sgs:
                writer.writerow([
                    Account_Name,
                    region,
                    elem
                    ])
        s3 = boto3.client('s3')
        s3.put_object(Body=csvio.getvalue(), ContentType='application/vnd.ms-excel', Bucket='######', Key='Unused_Security_Groups.csv', ACL='public-read') 

        csvio.close()
        s3.get_object(Bucket='#######', Key='Unused_Security_Groups.csv') 

    a_dev()

    def b_dev():
        Account_Name = 'B'
        #regions = ['eu-west-1','eu-west-2','us-east-2','us-west-1','us-west-2','us-east-1','ap-northeast-2','ap-southeast-1','ap-southeast-2','ap-northeast-1','ca-central-1','eu-west-3']
        regions = ['eu-west-1']

        csvio = io.BytesIO()
        writer = csv.writer(csvio)
        writer.writerow([
            'Account Name',
            'Region',
            'SecurityGroup-Id'
        ])
        for region in regions:
            #ec2 = boto3.resource('ec2', region_name=region)
            sgs = list(b_dev_client.security_groups.all())
            insts = list(b_dev_client.instances.all())
            all_sgs = set([sg.group_id for sg in sgs])
            all_inst_sgs = set([sg['GroupId'] for inst in insts for sg in
            inst.security_groups])
            unused_sgs = all_sgs - all_inst_sgs
            for elem in unused_sgs:
                writer.writerow([
                    Account_Name,
                    region,
                    elem
                    ])
        s3 = boto3.client('s3')
        s3.put_object(Body=csvio.getvalue(), ContentType='application/vnd.ms-excel', Bucket='#######', Key='Unused_Security_Groups.csv', ACL='public-read') 

        csvio.close()
        s3.get_object(Bucket='#######', Key='Unused_Security_Groups.csv') 

    b_dev()

Обновление:

После того, как я пытаюсь добавить CSV, я получаю «Только для чтения»Файловая система "Ошибка.

    def b_dev():
        Account_Name = '2'
        regions = ['us-west-1']

        csvio = io.BytesIO()
        writer = csv.writer(csvio)
        fields=['Account Name','Region','SecurityGroup-Id']
        with open('Unused_Security_Groups.csv', 'a') as f:
            writer = csv.writer(f)
            writer.writerow(fields)
            for region in regions:
                #ec2 = boto3.resource('ec2', region_name=region)
                sgs = list(bi_dev_client.security_groups.all())
                insts = list(bi_dev_client.instances.all())
                all_sgs = set([sg.group_id for sg in sgs])
                all_inst_sgs = set([sg['GroupId'] for inst in insts for sg in
                inst.security_groups])
                unused_sgs = all_sgs - all_inst_sgs
                for elem in unused_sgs:
                    writer.writerow([
                        Account_Name,
                        region,
                        elem
                        ])
            s3 = boto3.client('s3')
            s3.put_object(Body=csvio.getvalue(), ContentType='application/vnd.ms-excel', Bucket='######', Key='Unused_Security_Groups.csv', ACL='public-read') 

            csvio.close()
            s3.get_object(Bucket='######', Key='Unused_Security_Groups.csv') 

1 Ответ

1 голос
/ 26 сентября 2019

Первый добавить новый лист в CSV-файл просто бессмысленно. Файл CSV не является файлом Excel .Это последовательный текстовый файл, который автоматически обрабатывается Excel как электронная таблица.Но он не поддерживает несколько листов.

Но добавить к файлу CSV легко: просто откройте файл в режиме добавления ("a") вместо режима перезаписи ("w").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...