人間のあるべき姿の探索

思索・人形・エンジニアリング

Pythonのf.readline()関数で知らなかった挙動

これは日記なのでちゃんとした技術ブログではないです.  

想定場面

Pythonでセンサデータのようなリアルタイムに更新されるデータを扱いたいが,直接センサデータを受け取れずcsvのようなファイルを仲介する場合. 例:csvを吐き出す.exeやモジュールを実行する必要があり,直接変数を受け取れない場合.

事例

例えば以下のような3軸の姿勢をcsv形式で吐き出すプログラムがあったとする.

x, y, z
0, 0, 0
0.1, 0, 0.2
0.1, 0.3, 0.2

これを下のプログラムで読み込む.

with open(filename, "r") as f:
    while True:
        data = f.readline()
        print("recv:{}".format(data))

非直感的だが,readlineが最終行に達してしまった場合特にエラーを吐くことなく,dataには""が格納される. 更に,csvファイルに新しい行が追加された場合,それを読み込んでdataに格納してくれる. つまり,出力が以下のような感じになる.

> recv:x, y, z
> recv:0, 0, 0
> recv:0.1, 0, 0.2
> recv:0.1, 0.3, 0.2
> recv:
> recv:
> recv:
...
# ここでcsvファイルに新しい行"0.1, 0.2, 0.2"を追加して保存する
> recv:0.1, 0.2, 0.2

自動でやってくれるので,ファイルの更新ごとにファイルを読み直す必要などはないらしい.ふーん,便利じゃん.

注意点

f.readline()は行をカウントしている為,行が増えた場合に最終行を読み込むのみで途中の行の更新などは特に対応しない.

なので,新しい行への書き込みのみを行う場合に使うべきで,書き換えが生じるような場合は使えない.ただ,センサデータの取得といった用途に限れば問題ないと思う.

関係ない話

体のパーツが増えたり減ったりすると嬉しい!