静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


【python】ファイルのwritelinesは行を書いてくれない

はじめに

 使ったことがないので知らなかったのですが、表題の通りwritelinesは行を書いてくれません。

実験

 次のようなコードを書きます。

test_writelines.py

lst = ["hoge", "fuga", "piyo"]

with open("test.txt", "w") as f:
    f.writelines(lst)

 粛々と実行。

$ python test_writelines.py 
$ cat test.txt 
hogefugapiyo$

 なんで?

理由と対処法

 もうこれはこういう仕様なので、諦めるしかありません。

writelines(lines)
ストリームに行のリストを書き込みます。行区切り文字は追加されないので、書き込む各行の行末に行区切り文字を含ませるのが一般的です。
io --- ストリームを扱うコアツール — Python 3.7.4rc1 ドキュメント

 うげぇ……いや、言いたいことはわかるんですが、期待していた結果と違ったので……

 対処法はいろいろありますね。

with open("test.txt", "w") as f:
    f.write("\n".join(lst))

 とか

with open("test.txt", "w") as f:
    for x in lst:
        f.write(x + "\n")

 とか

with open("test.txt", "w") as f:
    print(*lst, sep="\n", file=f)

 とかすれば良いでしょう。

まとめ

 まあ、基本的な仕様でも使わない機能だと把握していなかったりする訳で、ドキュメントの確認は大切ですね。

 あと、Pythonはたまにユーザを裏切るというか、小さい「罠」を忍ばせてるので、油断なりませんね。