テキストファイルの一期読み込みに今まで Gio を利用していた。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from gi.repository import Gio
# Create GLocalFile
f = Gio.File.new_for_path("test.txt")
# load_contents(GCancellable)
result, contents, length = f.load_contents(None)
if result:
print contents
のだけど g_file_get_contents という関数が GLib にあった。
File Utilities
コチラの関数なら GLocalFile を介さず一発で読み込み完了ができるみたい。
g_file_set_contents で書き込みも一発でイケるようだし便利そうだ。
ただ PyGI ではどう書く?
ということで実験。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
from gi.repository import GLib
TEXT = """KAWASAKI
Ninja 250
Z250"""
# Text file Write
try:
if GLib.file_test("write.txt", GLib.FileTest.EXISTS):
print "'write.txt' is EXISTS"
sys.exit()
result = GLib.file_set_contents("write.txt", TEXT)
if result:
print "Write Success"
except Exception, e:
print "Error @ {0}".format(e)
sys.exit()
# Text file Read
try:
result, contents = GLib.file_get_contents("write.txt")
if result:
print contents
except Exception, e:
print "Error @ {0}".format(e)
sys.exit()
g_file_set_contents は無条件で上書きしてしまうようです。
g_file_test 関数で存在確認を行ってから相応の処理を行ったほうがいい。
引数の GError は Python の例外として渡ってくるようです。
# Exception intentional
GLib.file_set_contents("/write.txt", TEXT)
のように root 権限位置に指定等を行うと例外が出力されることが解ります。
g_file_get_contents は存在しないファイル名指定なら例外になる。
戻り値を if で振り分ける必要は無いかも。
load_contents にある GCancellable というあまり必要を感じない指定も不要で簡単。
ストリーミング I/O で行う必要の無い少量の読み書きならコチラのほうが簡単ですね。
Python なんだから組み込みの open を使う人がほとんどなんだろうけど。
せっかく GLib が丸々使える環境なんだからもったいないじゃないか。