1647

私はいくつかのコード ゴルフチャレンジを実行しようとしていますが、すべて から入力を取得する必要がありますstdin。Pythonでそれを取得するにはどうすればよいですか?

4

23 に答える 23

1059

モジュールを使用できfileinputます:

import fileinput

for line in fileinput.input():
    pass

fileinputコマンドライン引数で指定されたファイル名として指定された入力のすべての行、または引数が指定されていない場合は標準入力のすべての行をループします。

注:line末尾に改行が含まれます。それを削除するにはline.rstrip()

于 2009-09-21T13:01:14.333 に答える
787

いくつかの方法があります。

  • sys.stdin関数を呼び出すことができるファイルのようなオブジェクトです。readまたはreadlines、すべてを読みたい場合、またはすべてを読み込んで改行で自動的に分割したい場合。(これが機能するために必要ですimport sys。)

  • ユーザーに入力を求める場合は、Python 2.X で使用でき Python raw_input3 でのみinput使用できます。

  • 実際にコマンド ライン オプションを読みたいだけの場合は、sys.argvリストからアクセスできます。

Python での I/O に関するこの Wikibook の記事も参考になるでしょう。

于 2009-09-20T05:53:17.040 に答える
543
import sys

for line in sys.stdin:
    print(line)

これには、最後に改行文字が含まれることに注意してください。最後に改行を削除するには、line.rstrip()@brittohalloran が言ったように使用します。

于 2010-07-20T10:30:06.207 に答える
265

Python には組み込み関数input()raw_input(). 組み込み関数の下の Python ドキュメントを参照してください。

例えば、

name = raw_input("Enter your name: ")   # Python 2.x

また

name = input("Enter your name: ")   # Python 3
于 2011-03-03T19:05:48.473 に答える
237

これはLearning Pythonからのものです:

import sys
data = sys.stdin.readlines()
print "Counted", len(data), "lines."

Unix では、次のようにしてテストできます。

% cat countlines.py | python countlines.py 
Counted 3 lines.

Windows または DOS では、次のようにします。

C:\> type countlines.py | python countlines.py 
Counted 3 lines.
于 2009-09-20T05:51:00.763 に答える
168

Python で stdin からどのように読み取りますか?

私はいくつかのコード ゴルフ チャレンジを実行しようとしていますが、すべて標準入力から入力を取得する必要があります。Pythonでそれを取得するにはどうすればよいですか?

以下を使用できます。

  • sys.stdin- ファイルのようなオブジェクト -sys.stdin.read()すべてを読み取るための呼び出し。
  • input(prompt)- 出力するオプションのプロンプトを渡します。標準入力から最初の改行まで読み取り、それを削除します。より多くの行を取得するには、これを繰り返し実行する必要があります。入力の最後で EOFError が発生します。(おそらくゴルフには向いていません。) Python 2 では、これはrawinput(prompt).
  • open(0).read()- Python 3 では、組み込み関数はファイル記述子(オペレーティング システムの IO リソースを表す整数)openを受け入れ、0 は の記述子です。これは次のようなファイルのようなオブジェクトを返します- おそらくゴルフに最適です。Python 2 では、これは.stdinsys.stdinio.open
  • open('/dev/stdin').read()- と同様にopen(0)、Python 2 および 3 で動作しますが、Windows (または Cygwin でさえ) では動作しません。
  • fileinput.input()- にリストされているすべてのファイルの行に対する反復子を返します。指定されsys.argv[1:]ていない場合は stdin を返します。のように使用し''.join(fileinput.input())ます。

もちろん、 と の両方sysfileinputそれぞれインポートする必要があります。

sys.stdinPython 2 および 3、Windows、Unix と互換性のある簡単な例

たとえば、データを stdin にパイプする場合は、readfromを実行する必要があります。sys.stdin

$ echo foo | python -c "import sys; print(sys.stdin.read())"
foo

sys.stdinデフォルトのテキスト モードになっていることがわかります。

>>> import sys
>>> sys.stdin
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>

ファイルの例

ファイル があるとします。inputs.txtそのファイルを受け入れて書き戻すことができます。

python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt

より長い答え

これは、組み込み関数input( raw_inputPython 2 で使用) との 2 つのメソッドを使用した、完全で簡単に複製可能なデモsys.stdinです。データは変更されていないため、処理は非操作です。

まず、入力用のファイルを作成しましょう。

$ python -c "print('foo\nbar\nbaz')" > inputs.txt

そして、既に見たコードを使用して、ファイルが作成されたことを確認できます。

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt 
foo
bar
baz

sys.stdin.readPython 3のヘルプは次のとおりです。

read(size=-1, /) method of _io.TextIOWrapper instance
    Read at most n characters from stream.
    
    Read from underlying buffer until we have n characters or we hit EOF.
    If n is negative or omitted, read until EOF.

組み込み関数input( raw_inputPython 2 の場合)

組み込み関数inputは、標準入力から改行まで読み取ります。改行は削除されます (補完printし、デフォルトで改行が追加されます)。これは、EOF (End Of File) を取得するまで発生し、その時点で が発生しEOFErrorます。

したがって、inputPython 3 (またはraw_inputPython 2) で stdin から読み取る方法は次のとおりです。したがって、stdidemo.py と呼ばれる Python モジュールを作成します。

$ python -c "print('try:\n    while True:\n        print(input())\nexcept EOFError:\n    pass')" > stdindemo.py 

そして、それを印刷して、期待どおりであることを確認しましょう。

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < stdindemo.py 
try:
    while True:
        print(input())
except EOFError:
    pass

繰り返しinputますが、改行まで読み取り、基本的に行から削除します。print改行を追加します。したがって、両方が入力を変更している間、変更はキャンセルされます。(したがって、それらは本質的に互いの補完物です。)

そして、inputファイル終了文字を取得すると、EOFError が発生しますが、これは無視してプログラムを終了します。

Linux/Unix では、cat からパイプできます:

$ cat inputs.txt | python -m stdindemo
foo
bar
baz

または、stdin からファイルをリダイレクトすることもできます。

$ python -m stdindemo < inputs.txt 
foo
bar
baz

モジュールをスクリプトとして実行することもできます。

$ python stdindemo.py < inputs.txt 
foo
bar
baz

inputPython 3のビルトインのヘルプは次のとおりです。

input(prompt=None, /)
    Read a string from standard input.  The trailing newline is stripped.
    
    The prompt string, if given, is printed to standard output without a
    trailing newline before reading input.
    
    If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
    On *nix systems, readline is used if available.

sys.stdin

ここでは、 を使用してデモ スクリプトを作成しsys.stdinます。ファイルのようなオブジェクトを反復処理する効率的な方法は、ファイルのようなオブジェクトを反復子として使用することです。この入力から stdout に書き込む補完的な方法は、単純に次を使用することsys.stdout.writeです。

$ python -c "print('import sys\nfor line in sys.stdin:\n    sys.stdout.write(line)')" > stdindemo2.py

印刷して、正しく表示されることを確認します。

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < stdindemo2.py 
import sys
for line in sys.stdin:
    sys.stdout.write(line)

入力をファイルにリダイレクトします。

$ python -m stdindemo2 < inputs.txt
foo
bar
baz

コマンドにゴルフ:

$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt
foo
bar
baz

Golfing のファイル記述子

stdinとのファイル記述子はstdoutそれぞれ 0 と 1 であるため、これらをopenPython 3 に渡すこともできます (2 ではありません。stdout に書き込むには 'w' がまだ必要であることに注意してください)。

これがシステムで機能する場合、より多くの文字が削除されます。

$ python -c "open(1,'w').write(open(0).read())" < inputs.txt
baz
bar
foo

Python 2io.openもこれを行いますが、インポートにはさらに多くのスペースが必要です。

$ python -c "from io import open; open(1,'w').write(open(0).read())" < inputs.txt 
foo
bar
baz

他のコメントと回答への対処

1 つのコメントは''.join(sys.stdin)ゴルフを示唆していますが、実際には sys.stdin.read() よりも長くなります。さらに、Python はメモリ内に追加のリストを作成する必要があります (リストがstr.join指定されていない場合は、このように機能します)。対照的に:

''.join(sys.stdin)
sys.stdin.read()

一番の答えは次のことを示唆しています:

import fileinput

for line in fileinput.input():
    pass

しかし、sys.stdinイテレータ プロトコルを含むファイル API を実装しているため、これは次のようになります。

import sys

for line in sys.stdin:
    pass

別の答えこれを示唆しています。インタープリターでこれを行う場合は、Linux または Mac を使用している場合、またはWindows を使用している場合(Ctrlの後)、ファイルの終わり文字をプロセスに送信する必要があることを覚えておいてください。また、その答えは、最後に a を追加することを示唆しています-代わりに使用します(Python 2の場合は、が必要です)。dCtrlzEnterprint(line)'\n'print(line, end='')from __future__ import print_function

の実際の使用例fileinputは、一連のファイルを読み取ることです。

于 2016-07-30T04:10:43.630 に答える
105

他の人が提案した答え:

for line in sys.stdin:
  print line

は非常に単純でpythonicですが、スクリプトはEOFまで待機してから、入力行の反復を開始することに注意する必要があります。

これは、tail -f error_log | myscript.pyラインが期待どおりに処理されないことを意味します。

このようなユースケースの正しいスクリプトは次のとおりです。

while 1:
    try:
        line = sys.stdin.readline()
    except KeyboardInterrupt:
        break

    if not line:
        break

    print line

更新
コメントから、Python 2ではバッファリングのみが関係している可能性があることが明らかになりました。そのため、印刷呼び出しが発行される前に、バッファがいっぱいになるかEOFを待つことになります。

于 2011-09-30T09:08:09.953 に答える
39

これにより、標準入力が標準出力にエコーされます。

import sys
line = sys.stdin.readline()
while line:
    print line,
    line = sys.stdin.readline()
于 2012-08-09T16:31:57.647 に答える
34

を使用してすべての回答に基づいて構築するsys.stdinと、次のようなことを行って、少なくとも 1 つの引数が存在する場合は引数ファイルから読み取り、それ以外の場合は stdin にフォールバックすることもできます。

import sys
f = open(sys.argv[1]) if len(sys.argv) > 1 else sys.stdin    
for line in f:
#     Do your stuff

どちらかとして使用します

$ python do-my-stuff.py infile.txt

また

$ cat infile.txt | python do-my-stuff.py

あるいは

$ python do-my-stuff.py < infile.txt

catこれにより、Python スクリプトは、grepやなどの多くの GNU/Unix プログラムのように動作しsedます。

于 2013-07-29T15:04:35.010 に答える
11

これまで誰もこのハッキングについて言及していなかったことに、私はかなり驚いています。

python -c "import sys; set(map(sys.stdout.write,sys.stdin))"

python2では、set()呼び出しをドロップできますが、どちらの方法でも使用できます

于 2016-11-07T10:08:28.307 に答える
7

これを試して:

import sys

print sys.stdin.read().upper()

そしてそれをチェックしてください:

$ echo "Hello World" | python myFile.py
于 2013-08-27T15:43:43.307 に答える
7

次のように、標準入力から読み取り、入力を「データ」に格納できます。

data = ""
for line in sys.stdin:
    data += line
于 2014-07-20T21:33:46.753 に答える
7

から読み取りますが、Windows でバイナリ データを読み取るにはsys.stdin、特に注意する必要があります。sys.stdin\r\n\n

解決策は、Windows + Python 2 が検出された場合はモードをバイナリに設定し、Python 3 では を使用することsys.stdin.bufferです。

import sys

PY3K = sys.version_info >= (3, 0)

if PY3K:
    source = sys.stdin.buffer
else:
    # Python 2 on Windows opens sys.stdin in text mode, and
    # binary data that read from it becomes corrupted on \r\n
    if sys.platform == "win32":
        # set sys.stdin to binary mode
        import os, msvcrt
        msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    source = sys.stdin

b = source.read()
于 2016-08-14T05:12:41.660 に答える
5

Python 3の場合は次のようになります。

# Filename e.g. cat.py
import sys

for line in sys.stdin:
    print(line, end="")

各行の後に改行を追加しないため、これは基本的に cat(1) の単純な形式です。これを使用できます(次のchmod +x cat.pyような方法でファイルを実行可能としてマークした後:

echo Hello | ./cat.py
于 2019-05-04T18:23:51.333 に答える
2

パイプされたソケットを介して読み取るためにこれを機能させるときに、いくつかの問題がありました。ソケットが閉じられると、アクティブなループで空の文字列が返され始めました。これが私の解決策です(Linuxでのみテストしましたが、他のすべてのシステムで機能することを願っています)

import sys, os
sep=os.linesep

while sep == os.linesep:
    data = sys.stdin.readline()               
    sep = data[-len(os.linesep):]
    print '> "%s"' % data.strip()

したがって、ソケットでリッスンを開始すると、正しく機能します (たとえば、bash で):

while :; do nc -l 12345 | python test.py ; done

また、telnet で呼び出すか、ブラウザで localhost:12345 にアクセスするだけです。

于 2014-10-29T14:57:06.463 に答える