はじめに
S3 のバケットからバケットにファイルを移動したいときには、一番簡単なのは AWS CLI の S3 cp を使う方法がある。
でもファイル名にとある加工がしたかったので Python で、名前を変更しながらバケットからバケットにファイルをコピーするスクリプトを書いてみた。
こまりごと
とあるソフトが吐くファイル名が "YYYYMMDD_<英語名>_<日本語の漢字とかひらがなとか特殊記号とか>" みたいな形になっていて、前の部分の日付と英語名だけでじゅーぶんですよ、という気分になっていた。後ろの日本語とか雑多な記号を取り払いながら、他のバケットに出力することにした。
別に同じバケットでもいいけど S3 の良いところはバケットを分けてあげると、何かとその後の管理が楽になる。S3 バケットは 1 アカウントで 100 個まで作れて、お金もかからないのでなるべく役割や目的で分けてあげた方が良いと思う。
かいたもの
ちょっと前に書いたのでなんでそう書いたか思い出せないところがある。頭の棚が傷んでるから仕方ない。
あと文字の判定の条件文がきれいに書けなくて悔しかったので、そこは載せてないです。
from boto.s3.connection import S3Connection, Bucket, Key
S3_BUCKET_NAME = 'Yourbacketname'
S3_DST_BUCKET_NAME = 'Yourdestinationbucketname'
conn = S3Connection()
bucket = conn.get_bucket(S3_BUCKET_NAME)
# S3 にアクセスしてバケット内のオブジェクト一覧取得
rs = bucket.list()
for key in rs:
#取得したオブジェクトの一覧の各キーについて以下のような処理を実施
k=Key(bucket)
filename = key.name
#キーの名前(ファイル名)を加工したい...
result = u''
for c in filename:
#filename の一文字ずつについて
if condition:
#とある条件(特殊記号やマルチバイトを含まない純粋な英数字か?)にマッチしたら、その時だけ文字列を新しいファイル名に追加
result += c
print result
k.key=filename
k.copy(S3_DST_BUCKET_NAME, result)
#ファイルを出力したい先のバケットにファイルをコピーして終了
k.delete()
#元バケットのファイルはいらないから消した。別に残しておいてもいいと思う。
おわりに
とりあえず思った通りに動いたけど、もしかすると要らない記述が混じっている感じがする。
今のように直感的でなくもうちょっとちゃんと理解して書けるようになりたいところ。