ボーっとしたい

ボーっとするためにメモします。

PythonでS3上のにある2つのファイルを結合する

Pythonを使って、S3上にある2つのファイルを結合して出力する。目的としては、ヘッダーのないcsvファイルにヘッダーをつける。 pandasを使って読み込むと余計なオーバーヘッドがあるので、StringIOでメモリ上に乗せてくっつけるだけにする。

サンプルコードは以下の通り

import boto3
import io

# define args
src_bucket = "src_bucket"
src_prefixKey_header = "hoge/hoge_header.csv"
src_prefixKey_data = "hoge/hoge_data.csv"
dest_bucket = "dest_bucket"
dest_prefixKey = "hoge/hoge_out.csv"

SRC_FILE_ENCODING="utf-8"

s3 = boto3.resource('s3')

#ヘッダファイルの読み込み
src_obj_header = s3.Object(
  src_bucket,
  src_prefixKey_header
)
body_in_header = src_obj_header.get()['Body'].read().decode(
  SRC_FILE_ENCODING
)
buffer_in_header = io.StringIO(body_in_header)

#データファイルの読み込み
src_obj_data = s3.Object(
  src_bucket,
  src_prefixKey_data
)
body_in_data = src_obj_data.get()['Body'].read().decode(
  SRC_FILE_ENCODING
)
buffer_in_data = io.StringIO(body_in_data)

# ヘッダとデータの結合
outputs = list()
outputs.append(buffer_in_header)
outputs.append(buffer_in_data)

buffer_out=io.StringIO()
buffer_out.write(''.join([i.getvalue() for i in outputs]))
body_out=buffer_out.getvalue()

#ファイル配置
dest_obj = s3.Object(
  dest_bucket,
  dest_prefixKey
)
dest_obj.put(Body = body_out)

参考URL

S3バケット上のCSVファイルをバッファに読み出してpandasで編集する | DevelopersIO

concatenation - python how to concat stringio objects? - Stack Overflow