g_file_get_contents

テキストファイルの一期読み込みに今まで 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 が丸々使える環境なんだからもったいないじゃないか。