[python] stdin에서 어떻게 읽습니까?

코드 골프 도전 과제 중 일부를 수행하려고 하지만 모두 입력을 받아야합니다 stdin. 파이썬에서 어떻게 얻습니까?



답변

fileinput모듈을 사용할 수 있습니다 :

import fileinput

for line in fileinput.input():
    pass

fileinput 명령 행 인수에 지정된 파일 이름으로 지정된 입력의 모든 행 또는 인수가 제공되지 않은 경우 표준 입력을 반복합니다.

참고 : line후행 줄 바꿈이 포함됩니다. 그것을 제거하기 위해line.rstrip()


답변

몇 가지 방법이 있습니다.

  • sys.stdin함수를 호출 read하거나 readlines모든 것을 읽거나 모든 것을 읽고 개행으로 자동 분할하려는 경우 파일과 같은 객체입니다 . ( import sys이 작업을 수행 해야합니다 .)

  • 당신이 할 경우 하라는 메시지가 사용자에게 입력, 당신이 사용할 수있는 raw_input파이썬 2.X에서, 그냥 input파이썬 3인치

  • 실제로 명령 줄 옵션 만 읽으려면 sys.argv 목록을 통해 액세스 할 수 있습니다 .

당신은 아마 찾을 수 파이썬에서 I / O에이 Wikibook 기사 뿐만 아니라 유용한 참고 자료가 될 수 있습니다.


답변

import sys

for line in sys.stdin:
    print(line)

끝에 줄 바꿈 문자가 포함됩니다. 마지막에 개행을 제거하려면 line.rstrip()@brittohalloran이 말한대로 사용하십시오 .


답변

파이썬은 또한 내장 함수 input()를 가지고 raw_input()있습니다. 내장 함수 아래의 Python 설명서를 참조하십시오 .

예를 들어

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

또는

name = input("Enter your name: ")   # Python 3


답변

다음은 Python 학습 의 내용입니다 .

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

유닉스에서는 다음과 같은 방법으로 테스트 할 수 있습니다.

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

Windows 또는 DOS에서는 다음을 수행하십시오.

C:\> type countlines.py | python countlines.py
Counted 3 lines.


답변

파이썬에서 stdin을 어떻게 읽습니까?

코드 골프 과제 중 일부를 수행하려고하지만 모두 입력을 stdin에서 가져와야합니다. 파이썬에서 어떻게 얻습니까?

당신이 사용할 수있는:

  • sys.stdin-파일과 같은 객체- sys.stdin.read()모든 것을 읽도록 호출 합니다.
  • input(prompt)-출력 할 옵션 프롬프트를 전달하면 stdin에서 첫 번째 줄 바꿈까지 읽습니다. 더 많은 라인을 얻으려면이 작업을 반복적으로 수행해야합니다. 입력이 끝나면 EOFError가 발생합니다. (아마도 골프에는 좋지 않습니다.) Python 2에서 이것은입니다 rawinput(prompt).
  • open(0).read()-Python 3에서 내장 함수 open파일 디스크립터 (운영 체제 IO 자원을 나타내는 정수)를 허용하며 0은의 디스크립터입니다 stdin. sys.stdin골프 와 같은 파일과 같은 객체를 반환합니다 . 파이썬 2에서 이것은입니다 io.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에서 사용) 와의 두 가지 방법을 사용하여 완전하고 쉽게 복제 가능한 데모 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.read은 Python 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 (파일 끝)에 도달 할 때까지 발생합니다 EOFError.

따라서 input파이썬 3 (또는 raw_input파이썬 2)에서 stdin에서 읽는 방법을 알려면 stdindemo.py라는 파이썬 모듈을 만듭니다.

$ 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

다음 input은 Python 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

골프 용 파일 설명자

stdinand 의 파일 디스크립터는 stdout각각 0과 1이므로, open파이썬 3 에서도 파일 디스크립터를 전달할 수 있습니다 (2가 아니라 stdout에 쓰는 데 여전히 ‘w’가 필요함).

이것이 시스템에서 작동하면 더 많은 문자가 제거됩니다.

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

파이썬 2 io.open도이 작업을 수행하지만 가져 오기에는 더 많은 공간이 필요합니다.

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

다른 의견 및 답변 해결

한 의견은 ''.join(sys.stdin)골프를 제안 하지만 실제로는 sys.stdin.read ()보다 길다-파이썬은 메모리에 추가 목록을 만들어야합니다 (목록을 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

또 다른 대답 이것을 제안합니다. 그냥 당신이 통역에 그것을 할 경우, 당신이해야 할 것이라는 점을 기억 Ctrld당신이 리눅스 또는 Mac에 있다면, 또는 CtrlzWindows에서 (후 Enter프로세스에 파일 끝 문자를 보낼 수). 또한 그 대답은 대신 최종 사용에 print(line)a '\n'를 추가하는 것을 제안 print(line, end='')합니다 (Python 2의 경우 필요합니다 from __future__ import print_function).

실제 사용 사례 fileinput는 일련의 파일을 읽는 것입니다.


답변

다른 사람들이 제안한 답변 :

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

업데이트
의견에서 파이썬 2에는 버퍼링 만있을 수 있으므로 인쇄 호출이 발행되기 전에 버퍼가 채워지거나 EOF가 될 때까지 기다리게됩니다.