2014年4月28日月曜日

三重交通 1000 電気バス QPG-LV234N3改(?)

三重交通 1000 電気バス QPG-LV234N3改
2014.04.19 伊勢市駅前にて

2014年3月31日から、宇治山田駅前~伊勢市駅前~外宮前~内宮前の直行バス用に新車導入された電気バスです。神都バスとは異なり運賃のみで乗車ができます。そのほか詳細は公式のpdfをご覧下さい。電気バスということで車体にはピカチュウのラッピングが施されています。

2014年4月5日土曜日

python でファイルに append するとき

自分がつまずいたので、誰かの役に立てば。。

一番簡単なのは組み込み関数 open を使う方法。
f = open("filename", "a")
f.write("hogehgoe")
f.flush()
f.close()

aは append の頭文字。ファイルが既に存在している時は、末尾にデータを書き加えていく。
ファイルが存在しない時は、w(write)と同様で、ファイルを作成してデータを書き込んでいく。
ただしこの方法では作成されたファイルのパーミッションが設定できなかったはず。
そこで2番目の方法、 os.fdopen と os.open を使う方法。

f = os.fdopen(os.open("filename", os.O_APPEND | os.O_CREAT, 0755), "a")
f.write("hogehgoe")
f.flush()
f.close()

まず os.open でファイルを開く。その時に flag として O_APPEND と O_CREAT (ファイルが
存在しない時はファイルを作成する)を指定し、作成時のパーミッション 0755 (最初の0は
8進数の意味)を引数として与える。
そして次に os.fdopen で読み書きに必要なファイルオブジェクトを取得する。ここでもaモードを
指定しておかないと、ファイルオブジェクトのほうが追記モードであることを認識できないから
f.write で IOError が発生する。

さて、ここで invalid argument がと言われてしまって困った。
結果から言うと、 os.open の flag には O_RDONLY, O_WRONLY, O_RDWR のいずれか1つだけを
必ず指定する必要がある。それぞれ読み取り専用、書き込み専用、読み書き可能。
したがって、この例だと1行目を以下のように書き換えればよい。

f = os.fdopen(os.open("filename", os.O_APPEND | os.O_CREAT | os.O_WRONLY, 0755), "a")


ちなみに、 C# や Java なんかだと、 flush や close を勝手にやってくれる using なんてものが
ありますが、 python にも似たようなものがあって、 with というものらしいです。

with os.fdopen(os.open("filename", os.O_APPEND | os.O_CREAT | os.O_WRONLY, 0755), "a") as f:
f.write("hogehoge")

これでいいらしい。