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