プログラミングのネタ帳

30代からプログラミングをはじめた。記憶力が悪いのでメモ代わりに。

pythonの readline() 関数で、最終行の判定の仕方

ファイルの読み出しには一行ずつ読めるreadline()を使うことが多いと思います。

私はこれまでは、

tmp="tmp"

while(tmp):

    tmp=f.readline()

のようにしていました。

文末でfalse的なものを返すのだろうと想像はしていたのですが、あまりエレガントではないので(一行目が)調べてみました。

 

readline()の最終行では空白行を返しているようです。

では行間の空白行はどうなるのかというと、改行コード '\n' があるので1文字とカウントするため文末にはならないとのこと。(下記リンク、7.2.1章参照)

7. 入力と出力 — Python 3.9.2 ドキュメント

 

振る舞いのテストコードを作ってみました。

最終行では0文字であること、空白行でも1文字あることが分かります。


#readline()のふるまいを確認するプログラム
#空白行でも改行コード \n があるので、1文字としてカウントされる 
#ファイルの終わりでは文字数が0になるので、そのタイミングでbreakし終了する
def check_readline_behave():
    with open("text.txt","r") as f:
        while(1):
            tmp=f.readline()
            print("this line have",len(tmp),"char data:",tmp,end="")
            if(len(tmp)==0):
                print("")
                break

#テストデータ生成用のプログラム 
#以下の例では
#1行目: 1
#2行目: 
#3行目: 2 3
def make_test_data():
    with open("text.txt","w") as f:
        print("1",file=f)
        print("",file=f)
        print("2 3",file=f)

if __name__=="__main__":
    make_test_data()
    check_readline_behave()
 
実行結果
this line have 2 char, data: 1
this line have 1 char, data:
this line have 4 char, data: 2 3
this line have 0 char, data:
    

 

上記例でいうと、最終行でtmpは空白となるので、

if(not tmp):break

 

とすることでループを打ち切られます。