ゆくゆくは有へと

おかゆ/オカ∃/大鹿有生/彼ノ∅有生 の雑記

input と print を使わずに標準入出力

アホ記事です。

Python の組み込み関数 open はパス渡さずに整数渡すと、そのファイルディスクリプタのファイルオブジェクトを渡してくれます。

言わずもがな(言ってほしい人向け:ファイル記述子 - Wikipedia)、0 を渡せば標準入力から読み取れるようになるし、1 を渡せば標準出力に書き込めるようになります。

まずは標準入力。

> python
Python 3.5.1 |Anaconda custom (64-bit)| (default, Feb 16 2016, 09:49:46) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open(0)
>>> f.read()
aiueo
^Z
'aiueo\n'
>>> stdin.readline()
aiueo
'aiueo\n'

EOFを忘れずに(Winなら Ctrl+C)。1行だけ読みたいなら、readline()を使いましょう。ちなみに、このファイルオブジェクトを閉じようとすると Python が落ちます(例外があがるんじゃなくて最初ビビった)。

次に標準出力。

> python
Python 3.5.1 |Anaconda custom (64-bit)| (default, Feb 16 2016, 09:49:46) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> with open(1, 'w') as f:
...   f.write("HELLO!\n")
...
HELLO!
7
>>> f = open(1, 'w')
>>> f.write("aaa")
3
>>> f.flush()
aaa>>> f.close()

出力のほうは、close() されるまでバッファされて、まとめて出力されるようです。というか、close()時にフラッシュされるからっぽいので、すぐに出力したい場合はflush()しましょう。ちなみに HELLO! の下にある 7 についてですが、これは f.write("HELLO!\n") の返り値です(どうやら書き込んだ文字数っぽい)

open関数やファイルオブジェクトについてはこちらをどうぞ。