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