PythonでS3にファイルを保存する

2014-09-30
このエントリーをはてなブックマークに追加

ユーザーがアップロードした画像とかをS3に保存したいときに使うメモ。

AWSのAccessKeyとSecretAccessKeyはAWSコンソールにログインして、「右上のアカウント名 > Security Credentials」 で生成しておきます。

pip install boto

S3に投げ込むのはboto(読みはボートー、でいいんだろうか。。。)だけあればOK。Python2.7でもPython3.4でもpipでインストールできました。

$ pip freeze
boto==2.32.1

投げ込むコードは以下

from boto.s3.connection import S3Connection
from boto.s3.key import Key


def main():
    print('start')
    _s3 = S3Connection(
        'AccessKey',
        'SecretAccessKey',
    )
    _bucket = _s3.get_bucket('バケット名称')
    _key = Key(_bucket)
    _key.set_metadata('Content-Type', 'image/jpeg')
    _key.key = 'img.jpg'
    _key.set_contents_from_filename('./img.jpg')

if __name__=='__main__':
        main()

非常に簡単。

set_metadataは無くてもJpegファイルの場合は問題ないっぽいけど、Content-Typeによっては問題が出たりするのかもしれない。

バケット側のパーミッションとかポリシーとかはまた別の話ということで。

PythonでYAMLを読んでみた

2014-09-19
このエントリーをはてなブックマークに追加

今更感満載なんですけど、最近何度か続いてyaml触ったもんでメモとして。

使うのはPyYAMLです。

pip install pyyaml

Python2でもPython3でも上記で入るはずです。2.7と3.4で試しました。

host: HOSTNAME
port: PORT
dbname: DBNAME
user: USERNAME
passwd: PASSWD

こんなYAMLをDBの接続情報として用意しておいたとして、

import yaml

def main():
    _var = open('./settings.yaml').read()
    _yaml = yaml.load(_var)

    print(_yaml['host'])


if __name__ == "__main__":
    main()

読んだYAMLは辞書になってますので、_yaml[キー]で触れます。
ちょっとした設定ファイルとかには便利ですね。

Python3.4でMySQLに接続してDjangoでも使ってみる

2014-09-18
このエントリーをはてなブックマークに追加

MySQLドライバはどれを使えばいいのかはっきりわからない、というのがPython3に本格的に踏み込めないでいた一番の理由がだったわけですが、MySQL Connector/PythonがPython3をサポートしててDjangoでも使えてマルチバイト文字もちゃんと通るっぽかったので試してみました。

unzip mysql-connector-python-1.2.3.zip
cd mysql-connector-python-1.2.3
python setup.py install
pip freeze

インストールはこれだけ。
DB-API 2.0準拠らしいので触り方も変わらずに安心。こういうのがPythonのいいところじゃないかと。

import mysql.connector


def main():

    _conn = mysql.connector.connect(
            user='USERNAME',
            password='PASSWD',
            host='127.0.0.1',
            database='DBNAME')

    _cur = _conn.cursor()
    _cur.execute("select * from app_comment;")
    for _row in _cur.fetchall():
        print(_row[0])

    _cur.close()
    _conn.close()

if __name__ == '__main__':
    main()

DjangoからMySQLを使うときはこれで。

DATABASES = {
    'default': {
        'NAME': 'DBNAME',
        'ENGINE': 'mysql.connector.django',
        'USER': 'USERNAME',
        'PASSWORD': 'PASSWD',
    }
}

マルチバイト文字使ってもinsert,update、selectひと通り問題なさ気だったので試しになんか書いてみようと思いました。

あ、Djangoは1.7で試してます。

CentOSにPython3.4をインストールして仮想環境を作るところまでやってみた

2014-09-17
このエントリーをはてなブックマークに追加

「Python3やんなきゃね」が季節の挨拶じみてきたので久々に重い腰をあげてみました。もう3.4かいな。
Djangoも1.7とか。

sudo wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz
sudo tar zxfv Python-3.4.1.tgz
cd Python-3.4.1
sudo ./configure --enable-shared
sudo make & make install

sudo vi /etc/ld.so.conf
/usr/local/lib
ldconfig

ここまででPython3.4が起動するようになりました。
試しに

# /usr/local/bin/python3.4

Python 3.4.1 (default, Sep 16 2014, 12:43:31)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

おぉ、できたできた。
ついでに仮想環境も。
mkvirtualenvじゃなくてPython3っぽくvenvを使ってみます。

/usr/local/bin/python3.4 -m venv demo34
source demo34/bin/activate
pip freeze
deactivate

easy_installとの決別です。
気になるのはMySQLのドライバかなー。

Pythonのリスト内包表記でif文を使う

2013-07-03
このエントリーをはてなブックマークに追加

他の言語をやってきた方たちからは「読みにくい」といわれることも多いリスト内包表記ですが、まぁPythonなんでよく使います。

# -*- encoding: utf-8 -*-

a = '1,2,3,4,5,'
p = [item for item in a.split(',') if not item == '']

print(p)

例として適切かどうかは不安なのですが、「カンマでスプリットしたいけどケツカンマの場合の空白は除きたい」っていうケースで使えると思います。

p = a.rstrip(',').split(',')

でもできるじゃん、っていうのは知ってる上です。まぁリスト内包表記でもif文使えるよ、っていうだけでした。

イテレートするのとリスト内包表記使うのとだと、どれくらい速度差出るんだろう。今度測ってみよう。

Pythonで文字列.format()を使ってフォーマットする

2013-06-11
このエントリーをはてなブックマークに追加

これまでですと文字列に変数埋め込んだりして成形するには%演算子を使ってたんですけど、どうやら%演算子はいずれなくなるとのことでして、format()を使ってみました。

# -*- coding: utf-8 -*-

_text = "あ%sう%sお" % ("い", "え")
print(_text)

_aiueo = "あ{0}う{1}お".format("い", "え")
print(_aiueo)

_kakikukeko = "か{ki}く{ke}こ".format(ki="き", ke="け")
print(_kakikukeko)

一番上が使い慣れた%演算子を使った書き方ですね。二番目と三番目がformat()を使った書き方。インデックスを指定してもいいし、添字を指定してもいいです。

正直、添字を使った書き方するときは辞書で書きたかったな。

_kakikukeko = "か{ki}く{ke}こ".format({'ki': 'き', 'ke': 'け'})

↑これはエラー出ますからね!

Python2.7でも3.3でも動作するサンプルです。

LionさんにPython3.3 rc1をインストールしてみる

2012-09-04
このエントリーをはてなブックマークに追加

社内で「いい加減Python3もうちっとちゃんと触っておいたほうがいいんじゃね?」って話になって、インストールされたまま放置になっていた3.2はそのまま放置で3.3rc1をインストールしてみました。

つーかもうすぐrcも取れるんですね。予定では9/22にリリースですか。

インストールはとっても簡単です。python.orgのダウンロードページ からインストーラー落としてきてダブルクリックしただけです。

/usr/local/bin/python3.3

で起動できます。インストール先はデフォルトだと/Library/Frameworks/Python.framework/Versions/3.3ですね。

Python 3.3.0rc1 (v3.3.0rc1:8bb5c7bc46ba, Aug 25 2012, 10:09:29)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>>

こんな感じです。

Python3.3からvirtualenvが標準機能として実装されるようになって、今のところそこが一番気になっています。早速試したのですが、ちょっと触った感じでは必要十分、といった印象でした。virtualenvwrapper無くてもいいわ。

venvの使い方は後日まとめるとして、とりあえずdistribute、pipのインストールまで。

pypi.python.org/pypi/distribute からdistributeをダウンロード。現時点では0.6.28でした。解凍してから

sudo /usr/local/bin/python3.3  setup.py install

でpython3.3用のeasy_installが入ります。MacOSXでデフォルトだと/Library/Frameworks/Python.framework/Versions/3.3/bin/easy_install だと思います。あとは

cd /Library/Frameworks/Python.framework/Versions/3.3/bin/
sudo ./easy_install pip

でpipが入ります。easy_install立場ねーなー。

シンボリックリンクと実際のパスが入り乱れてしまって読みにくくなりましたが、まぁこんな感じでとりあえず環境は作れました。まずはPyramidでなんか動くもの書いてみようかな。