Pythonを使ってs3にあるcsvファイルを編集してみる

今回pythonを初めて触って出力から編集まで全て戸惑ってしまったのでまとめておく。

csvを配列に入れて出力する

元々やりたかったことはcsvを配列に入れて出力すること。ただ、いろいろ問題が発生。

↓のコードはうまく配列に入れて出力できている。

import boto3
import io
import pandas as pd
import csv

SRC_BUCKET_NAME="参照元バケット名"
SRC_OBJECT_KEY_NAME="参照元キー名"
SRC_FILE_ENCODING="utf-8"
DEST_BUCKET_NAME="保存先バケット名"
DEST_OBJECT_KEY_NAME="保存先キー名"

s3 = boto3.resource('s3')

# csvを変数に格納
src_obj = s3.Object(
  SRC_BUCKET_NAME,
  SRC_OBJECT_KEY_NAME
)
body_in = src_obj.get()['Body'].read().decode(SRC_FILE_ENCODING)

# 配列に入れて吐き出す
# 文字列をファイルオブジェクトのように扱うことができる
st = io.StringIO()
# writeで書き込み
st.write(body_in)
# 操作する場所を指定
st.seek(0)
csv_f =csv.reader(st)

for row in csv_f:
  print(row)

Code language: PHP (php)

1文字1文字が配列に入ってしまう。

なぜかいい感じで出力してくれない…

i
d
,
n
a
m
e
,
j
o
b

1
,
a
a
a
,
t
e
a
c
h
e
r
...........↓永遠に続く.........

なんでこうなるのか…
本当はこうなってほしい↓

['id', 'name', 'teacher']
['id', 'name', 'job']
['1', 'aaa', 'teacher']
['2', 'bbb', 'singer']
['3', 'ccc', 'teacher']
['4', 'ddd', 'no']
['5', 'eee', 'student']
['6', 'fff', 'comedian']
['7', 'ggg', 'teacher']
['8', 'hhh', 'singer']
['9', 'iii', 'student']
Code language: JSON / JSON with Comments (json)

調べてみた結果、csvの編集をしたい場合にはファイルオブジェクトを通してやらないとうまくいかないようだ。

なので修正…

st = io.StringIO()
st.write(body_in)
st.seek(0)

csv_f =csv.reader(st)
for row in csv_f:
  print(row)
Code language: PHP (php)

これでうまくいった。

StringIO()

↑を使うことによってうまく操作できるっぽい

ファイルオブジェクトとは

オープンしたファイルを編集するには「ファイルオブジェクト」を通す必要がある。いわゆる、ファイルとプログラムの通訳的な役割を果たすものかな。

seek()とは

データの読み込む位置を移動する。

参考

【Python】ファイルの作成と読み込み open,write,read,with,seek

Pythonでcsv形式の文字列データをパースする

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA