코드 골프 챌린지 중 일부를 수행하려고 하지만 모두 stdin
에서 입력을 가져와야 합니다. 파이썬에서 어떻게 얻습니까?
질문자 :tehryan
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())
과 같이 사용하십시오.
sys
및 fileinput
각각 가져와야 합니다.
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
골프를 위한 파일 디스크립터
stdin
및 stdout
대한 파일 설명자는 각각 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
, grep
및 sed
와 같은 많은 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
echo
를 here 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
'etc. > StackOverFlow' 카테고리의 다른 글
Mathematica로 Waldo를 어떻게 찾나요? (0) | 2022.02.15 |
---|---|
업데이트 및 삭제를 위한 HTTP 상태 코드? (0) | 2022.02.15 |
GET 매개변수에서 값을 가져오는 방법은 무엇입니까? (0) | 2022.02.15 |
Git의 다른 분기에서 변경 사항을 선택적으로 병합하거나 선택하려면 어떻게 해야 합니까? (0) | 2022.02.15 |
Python에서 파일 이름에서 확장자 추출 (0) | 2022.02.15 |