日別アーカイブ: 2013/04/14

g_file_get_contents

テキストファイルの一期読み込みに今まで Gio を利用していた。

1
2
3
4
5
6
7
8
9
10
11
#!/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 ではどう書く?
ということで実験。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/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 の例外として渡ってくるようです。

1
2
# Exception intentional
GLib.file_set_contents("/write.txt", TEXT)

のように root 権限位置に指定等を行うと例外が出力されることが解ります。

g_file_get_contents は存在しないファイル名指定なら例外になる。
戻り値を if で振り分ける必要は無いかも。

load_contents にある GCancellable というあまり必要を感じない指定も不要で簡単。
ストリーミング I/O で行う必要の無い少量の読み書きならコチラのほうが簡単ですね。

Python なんだから組み込みの open を使う人がほとんどなんだろうけど。
せっかく GLib が丸々使える環境なんだからもったいないじゃないか。