3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python で Amazon S3 のバケットからバケットへファイル移動

Posted at

はじめに

S3 のバケットからバケットにファイルを移動したいときには、一番簡単なのは AWS CLI の S3 cp を使う方法がある。

AWS CLI Reference - S3 cp

でもファイル名にとある加工がしたかったので Python で、名前を変更しながらバケットからバケットにファイルをコピーするスクリプトを書いてみた。

こまりごと

とあるソフトが吐くファイル名が "YYYYMMDD_<英語名>_<日本語の漢字とかひらがなとか特殊記号とか>" みたいな形になっていて、前の部分の日付と英語名だけでじゅーぶんですよ、という気分になっていた。後ろの日本語とか雑多な記号を取り払いながら、他のバケットに出力することにした。

別に同じバケットでもいいけど S3 の良いところはバケットを分けてあげると、何かとその後の管理が楽になる。S3 バケットは 1 アカウントで 100 個まで作れて、お金もかからないのでなるべく役割や目的で分けてあげた方が良いと思う。

かいたもの

ちょっと前に書いたのでなんでそう書いたか思い出せないところがある。頭の棚が傷んでるから仕方ない。

あと文字の判定の条件文がきれいに書けなくて悔しかったので、そこは載せてないです。

s3rename.py
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()

#元バケットのファイルはいらないから消した。別に残しておいてもいいと思う。

おわりに

とりあえず思った通りに動いたけど、もしかすると要らない記述が混じっている感じがする。
今のように直感的でなくもうちょっとちゃんと理解して書けるようになりたいところ。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?