

ファイルに書き込む文字列の変数が複数あります。

[code]

    x = "Hello World"
    y = "google"
    z = "deep learning is very popular now"
    
[/code]

という変数が３つあります。このx・y・zをテキストファイルに書き込みたいです。

[code]

    f = open('text.txt', 'w')
    f.writelines(x)
    f.writelines(y)
    f.writelines(z)
    f.close()
    
[/code]

と書くべきなのでしょうか？それとも、

[code]

    f = open('text.txt', 'w')
    f.writelines(x)
    f.close()
    
    f = open('text.txt', 'w')
    f.writelines(y)
    f.close()
    
    f = open('text.txt', 'w')
    f.writelines(z)
    f.close()
    
[/code]

と書くべきなのでしょうか？どれもすっきりしたコードに感じないので、より良い書き方があればお願いします。  
ちなみに、テキストファイルには

[code]

    Hello World
    google
    deep learning is very popular now
    
[/code]

のように一列ずつ書き込みたいです。


CC BY-SA 3.0
2018-04-26T14:47:56.947
43581
2018-04-27T18:56:38.163
28329
question
python
ファイルに書き込む文字列の変数が複数ある


下のようにするのはどうでしょうか?

[code]

    s = "\n".join([x, y, z]) # '\n'は改行コードを表しています
    # x, y, zリストに入れて、改行コードで結合
    
    f = open("text.txt", "w") # text.txt を書き込みモードで開く
    f.write(s) # ファイルに書き込む 
    f.close() # ファイルを閉じる
    
[/code]


CC BY-SA 3.0
2018-04-26T15:19:18.237
43582
2018-04-27T06:46:06.227
2018-04-27T06:46:06.227
49
5246
43581
answer


どんなコードを「すっきり」と思うかは人それぞれですし、場合にもよると思いますが、  
とりあえず、こんなコードはいかがでしょう?

[code]

    with open('text.txt', 'w') as f:
      f.write(f'{x}\n{y}\n{z}\n')
    
[/code]

なお、Python 3.6 以上が必要です。


CC BY-SA 3.0
2018-04-26T15:55:53.753
43583
2018-04-26T15:55:53.753
5288
43581
answer


僕は1行で書ける処理は1行で書きたいので、pathlibモジュールを使います。  
内部的にはwith openを使用しているので、自動的にファイルがclose()されます。  
import文を足すと2行になってますが、気にしてはいけない。インデントしなくていいのがいいと思います。

[code]

    import pathlib
    pathlib.Path("test.txt").write_text('{}\n{}\n{}\n'.format(x,y,z))
    
[/code]

次の書き方のほうが短いので僕はよく使いますが、文字列連結のスピード及びメモリ効率が下がるので、沢山の文字列を連結するときは避けてください。質問例程度の文字列なら問題ないです。

[code]

    pathlib.Path("test.txt").write_text(x+"\n"+y+"\n"+z+"\n")
    
[/code]

次の書き方がスピードと効率と文字数の数が少ないので一番よいかもしれません。

[code]

    pathlib.Path("test.txt").write_text("\n".join([x,y,z])+"\n")
    
[/code]

"\n".joinという表現が違和感があるかもしれませんがこの表現はpythonでは標準的な表現です。  
下記に文字列連結に関する公式wikiの情報(英語ですが)がありますのでご参考にしてください。  
<https://wiki.python.org/moin/PythonSpeed/PerformanceTips#String_Concatenation>

追記として3回open
closeする案はおそらくスピードが出ないやり方だと思います。基本的に文字列の組み立てはメモリで行いファイルとのやりとりは極力少なく(1回)にするのが好ましいです。


CC BY-SA 3.0
2018-04-27T18:39:08.713
43616
2018-04-27T18:56:38.163
2018-04-27T18:56:38.163
25980
25980
43581
answer