S3チートシート

· ☕ 1

Python boto3でS3を触る際のチートシート

ググればたくさん出てくるんだけど、毎回探すの面倒だから、自分の用のチートシートを作ることにしました。

随時更新、追加していきます。

使いやすいように全部ファンクションにしていきます。

使うときは、ファンクションをコピーして、使い方通りに使えばOK

※分かりやすさ、使いやす重視のため、boto3.clientなどは毎回初期化しています。
必要に応じて外出しして下さい!

環境

library version
python 3.7
boto3 1.9.243
botocore 1.13.17

put

text

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def put_s3(bucket_name,file_name,body):
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucket_name)
    obj = bucket.Object(file_name)
    if type(body) is not str:
        body = json.dumps(body, ensure_ascii=False,
                                indent=4).encode('utf-8')
    return obj.put(
        Body=body,
        ContentEncoding='utf-8',
        ContentType='text/html'
    )

本文はstringでもdictでもlistでもOK

1
put_s3(,,)

dict to csv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def put_s3_dict_to_csv(bucket_name, file_name, header, datas):
    import io
    with io.StringIO() as f:
        writer = csv.DictWriter(f, fieldnames=header)
        writer.writeheader()
        [writer.writerow(data) for data in datas]
        s3 = boto3.resource("s3")
        s3.Bucket(bucket_name).put_object(Key=file_name,
                                        Body=f.getvalue())
        # csv.gzの場合
        # import gzip
        # s3.Bucket(bucket_name).put_object(Key=file_name,
        #                                 Body=gzip.compress(bytes(f.getvalue(), "utf-8"))) 

get

text

1
2
3
4
5
def get_s3_text(bucket_name,file_name):
    s3 = boto3.client('s3')
    obj = s3.get_object(Bucket=bucket_name, Key=file_name)
    body = obj['Body'].read()
    return body.decode('utf-8')

json to dict

1
2
3
4
5
6
def get_s3_dict(bucket_name,file_name):
    s3 = boto3.client('s3')
    obj = s3.get_object(Bucket=bucket_name, Key=file_name)
    body = obj['Body'].read()
    bodystr = body.decode('utf-8')
    return json.loads(bodystr)

csv to dict

1
2
3
4
5
6
7
def get_s3_csv_to_dict(bucket_name, file_name):
    s3 = boto3.resource('s3')
    s3.Bucket(bucket_name).download_file(Filename='tmp.csv', Key=file_name)
    with open('tmp.csv') as f:
        reader = csv.DictReader(f)
        body = [dict(row) for row in reader]
    return body

るな
るな
エンジニア