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")

これでいいらしい。

0 件のコメント:

コメントを投稿