etc./StackOverFlow

stdin에서 어떻게 읽습니까?

청렴결백한 만능 재주꾼 2022. 2. 15. 08:49
반응형

질문자 :tehryan


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



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

 import fileinput for line in fileinput.input(): pass

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

참고: line 에는 후행 줄 바꿈이 포함됩니다. 그것을 제거하려면 line.rstrip()


Community Wiki

몇 가지 방법이 있습니다.

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

  • 사용자에게 입력을 요청 하려면 Python 2.X에서 raw_input 을 사용하고 Python 3에서 input

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

Python의 I/O에 대한 이 Wikibook 기사도 유용한 참조 자료가 될 것입니다.


Mark Rushakoff

import sys for line in sys.stdin: print(line)

이것은 끝에 개행 문자를 포함합니다. 끝에서 줄 바꿈을 제거하려면 @brittohalloran이 말한 대로 line.rstrip line.rstrip()


user303110

Python에는 내장 함수 input()raw_input() 있습니다. 내장 함수 아래의 Python 문서를 참조하십시오.

예를 들어,

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

또는

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

Pat Notz

다음은 학습 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.

Community Wiki

Python의 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 과 같은 파일과 같은 객체를 반환합니다. 아마도 골프에 가장 적합한 방법일 것입니다. Python 2에서 이것은 io.open 입니다.
  • open('/dev/stdin').read() open(0) 과 유사하며 Python 2 및 3에서 작동하지만 Windows(또는 Cygwin)에서는 작동하지 않습니다.
  • fileinput.input() sys.argv[1:] 나열된 모든 파일의 줄에 대한 반복자를 반환하거나 지정되지 않은 경우 stdin을 반환합니다. ''.join(fileinput.input()) 과 같이 사용하십시오.

sysfileinput 각각 가져와야 합니다.

Python 2 및 3, Windows, Unix와 호환되는 빠른 sys.stdin

예를 들어 데이터를 stdin으로 파이프하는 경우 sys.stdin read

 $ 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 (Python 2에서 raw_input 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

다음은 Python 3의 sys.stdin.read 대한 도움말입니다.

 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 (Python 2의 raw_input

내장 함수 input 은 표준 입력에서 제거된 개행까지 읽습니다( print 보완). 이것은 EOF(End Of File)를 얻을 때까지 발생하며, 이 지점에서 EOFError 합니다.

따라서 Python 3에서 input raw_input )을 사용하여 stdin에서 읽는 방법은 다음과 같습니다. 따라서 stdindemo.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

다음은 Python 3 input 에 대한 도움말입니다.

 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

골프를 위한 파일 디스크립터

stdinstdout 대한 파일 설명자는 각각 0과 1이므로 open 도록 전달할 수도 있습니다(2가 아니라 stdout에 쓰기 위해 'w'가 여전히 필요함).

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

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

Python 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()보다 더 깁니다. 게다가 Python은 메모리에 추가 목록을 생성해야 합니다(목록이 제공되지 않을 때 str.join 대조를 위해:

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

최고 답변은 다음과 같이 제안합니다.

 import fileinput for line in fileinput.input(): pass

그러나 sys.stdin 은 iterator 프로토콜을 포함하여 파일 API를 구현하므로 다음과 같습니다.

 import sys for line in sys.stdin: pass

또 다른 대답 이것을 제안합니다. 인터프리터에서 수행하는 경우 Linux 또는 Mac의 경우 Ctrl - d 를 수행하고 Windows의 경우 Ctrl - z (Enter 이후)를 수행하여 파일 끝 문자를 프로세스. 또한 그 대답은 print(line) - 끝에 '\n' 을 추가하는 print(line, end='') 사용합니다(Python 2에서 필요한 경우 from __future__ import print_function ).

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


Aaron Hall

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

 for line in sys.stdin: print line

매우 간단하고 파이썬적이지만 스크립트는 입력 라인에서 반복을 시작하기 전에 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가 될 때까지 기다리게 됩니다.


Massimiliano Torromeo

이것은 표준 입력을 표준 출력으로 에코할 것입니다:

 import sys line = sys.stdin.readline() while line: print line, line = sys.stdin.readline()

rlib

sys.stdin 사용하여 모든 답변을 구축하면 다음과 같이 인수 파일에서 읽고 인수가 하나 이상 있으면 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 , grepsed 와 같은 많은 GNU/Unix 프로그램처럼 작동합니다.


Emil Lundberg

argparse 는 쉬운 솔루션입니다

Python 버전 2 및 3과 호환되는 예:

 #!/usr/bin/python import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('infile', default=sys.stdin, type=argparse.FileType('r'), nargs='?') args = parser.parse_args() data = args.infile.read()

이 스크립트는 여러 가지 방법으로 실행할 수 있습니다.

1. stdin

 echo 'foo bar' | ./above-script.py

echohere string 으로 대체하여 더 짧습니다.

 ./above-script.py <<< 'foo bar'

2. 파일 이름 인수 사용

 echo 'foo bar' > my-file.data ./above-script.py my-file.data

3. 특수 파일 이름을 통해 stdin -

 echo 'foo bar' | ./above-script.py -

oHo

다음 코드 칩이 도움이 될 것입니다( EOF 모든 stdin 차단을 하나의 문자열로 읽음).

 import sys input_str = sys.stdin.read() print input_str.split()

Chandan Kumar

지금까지 아무도 이 해킹에 대해 언급하지 않았다는 사실에 매우 놀랐습니다.

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

python2에서는 set() 호출을 삭제할 수 있지만 어느 쪽이든


Uri Goren

이 시도:

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

다음으로 확인하십시오.

 $ echo "Hello World" | python myFile.py

Bouba

stdin에서 읽고 다음과 같이 "데이터"에 입력을 저장할 수 있습니다.

 data = "" for line in sys.stdin: data += line

Wei

에서 읽기 sys.stdin 하지만 Windows에서 바이너리 데이터를 읽고, 당신이 있기 때문에 조심해야 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()

anatoly techtonik

다음 방법을 사용하면 stdin에서 문자열을 반환합니다(json 구문 분석에 사용). Windows에서 파이프 및 프롬프트와 함께 작동합니다(Linux에서는 아직 테스트되지 않음). 프롬프트할 때 두 줄 바꿈은 입력의 끝을 나타냅니다.

 def get_from_stdin(): lb = 0 stdin = '' for line in sys.stdin: if line == "\n": lb += 1 if lb == 2: break else: lb = 0 stdin += line return stdin

Bouni

솔루션에 대한 문제

 import sys for line in sys.stdin: print(line)

stdin에 데이터를 전달하지 않으면 영원히 차단됩니다. 이것이 내가 이 답변을 좋아하는 이유입니다. 먼저 stdin에 데이터가 있는지 확인한 다음 읽으십시오. 이것이 내가 한 일입니다.

 import sys import select # select(files to read from, files to write to, magic, timeout) # timeout=0.0 is essential b/c we want to know the asnwer right away if select.select([sys.stdin], [], [], 0.0)[0]: help_file_fragment = sys.stdin.read() else: print("No data passed to stdin", file=sys.stderr) sys.exit(2)

Tomas Tomecek

Python 3의 경우 다음과 같습니다.

 # Filename eg cat.py import sys for line in sys.stdin: print(line, end="")

이것은 기본적으로 cat(1)의 간단한 형태입니다. 각 줄 뒤에 개행 문자를 추가하지 않기 때문입니다. 이것을 사용할 수 있습니다(다음과 같이 chmod +x cat.py 사용하여 파일을 실행 가능한 것으로 표시한 후:

 echo Hello | ./cat.py

AdamKalisz

파이프로 연결된 소켓을 읽기 위해 이것이 작동하도록 할 때 몇 가지 문제가 있었습니다. 소켓이 닫히면 활성 루프에서 빈 문자열을 반환하기 시작했습니다. 그래서 이것은 그것에 대한 내 솔루션입니다 (리눅스에서만 테스트했지만 다른 모든 시스템에서 작동하기를 바랍니다)

 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

그리고 텔넷으로 호출하거나 브라우저에서 localhost:12345를 가리키도록 할 수 있습니다.


estani

이것을 고려하면:

for line in sys.stdin:

방금 매우 큰 파일에 대해 python 2.7(다른 사람의 제안에 따름)에서 시도했으며 위에서 언급한 이유로 정확하게 권장하지 않습니다(오랫동안 아무 일도 일어나지 않음).

나는 약간 더 파이썬적인 솔루션으로 끝났습니다 (그리고 더 큰 파일에서 작동합니다).

 with open(sys.argv[1], 'r') as f: for line in f:

그런 다음 다음과 같이 로컬에서 스크립트를 실행할 수 있습니다.

 python myscript.py "0 1 2 3 4..." # can be a multi-line string or filename - any std.in input will work

szeitlin

-c 명령을 사용할 때 까다로운 방법으로 stdin $ 시작하는 괄호 안에 따옴표로 묶어 쉘 스크립트 명령을 Python 명령에 전달할 수도 있습니다. 징후.

 python3 -c "import sys; print(len(sys.argv[1].split('\n')))" "$(cat ~/.goldendict/history)"

이것은 goldendict의 기록 파일에서 줄 수를 계산합니다.


kasravnd

표준 입력을 나타내는 0에서 xbytes를 읽는 os.read(0, x) 이것은 sys.stdin.read()보다 더 낮은 수준의 버퍼링되지 않은 읽기입니다.


Jay

출처 : http:www.stackoverflow.com/questions/1450393/how-do-you-read-from-stdin

반응형