답변:
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이 말한대로 사용하십시오 .
\r\n
줄 끝을 올바르게 처리하지 못합니다
파이썬은 또한 내장 함수 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.
cat
여기가 중복됩니다. 유닉스 시스템에 대한 올바른 호출은 python countlines.py < countlines.py
입니다.
readlines()
. 파일 객체는 메모리의 모든 데이터를 구체화하지 않고 반복되도록 설계되었습니다.
파이썬에서 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())
.모두 sys
와 fileinput
물론, 각각 가져와야합니다.
sys.stdin
Python 2 및 3, Windows, Unix와 호환되는 빠른 예제예를 들어 데이터를 stdin으로 파이프하는 경우 read
from 만하면 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_input
Python 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_input
Python 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
stdin
and 의 파일 디스크립터는 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
또 다른 대답 은 이것을 제안합니다. 그냥 당신이 통역에 그것을 할 경우, 당신이해야 할 것이라는 점을 기억 Ctrl- d당신이 리눅스 또는 Mac에 있다면, 또는 Ctrl- zWindows에서 (후 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가 될 때까지 기다리게됩니다.
for line in sys.stdin:
패턴은 하지 않습니다 EOF 기다립니다. 그러나 매우 작은 파일을 테스트하면 응답이 버퍼링 될 수 있습니다. 더 많은 데이터로 테스트하여 중간 결과를 읽는지 확인하십시오.
print line
는 3.1.3에서 깨어 났지만 print(line)
그렇지 않습니다.
for line in sys.stdin:
"EOF까지 차단"하지 않습니다. 이 파이썬 2의 미리 읽기 버그 해당 버퍼가 가득 찰 때까지 라인을 지연. EOF와 관련이없는 버퍼링 문제입니다. 이 문제를 해결하려면 for line in iter(sys.stdin.readline, ''):
( io.open()
일반 파일에 사용) 을 사용 하십시오. 파이썬 3에서는 필요하지 않습니다.
를 사용하여 모든 anwers를 빌드 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
즉 같은 많은 GNU / 유닉스 프로그램처럼 파이썬 스크립트 동작합니다을 만들 것 cat
, grep
하고 sed
.
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
또는 here string 으로 대체 echo
하여 더 짧습니다 .
./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 -
add_argument('--in'
스크립트로 파이프 --in -
하고 명령 행에 추가 할 수 있습니다. PS in
는 변수 / 속성에 대한 좋은 이름이 아닙니다.
in
변수의 나쁜 이름 일뿐 아니라 불법입니다. 예약 키워드로 args.in.read()
인해 InvalidSyntax 오류가 발생 in
합니다. infile
python argparse 문서처럼 간단히 이름을 바꿀 수 있습니다 : docs.python.org/3/library/…
나는 지금까지 아무도이 핵을 언급하지 않은 것에 놀랐다.
python -c "import sys; set(map(sys.stdout.write,sys.stdin))"
python2에서 set()
전화를 끊을 수는 있지만 어느 쪽이든 말입니다.
readlines
그 줄을 여러 줄로 나누고 join
다시 사용합니까? 당신은 그냥 쓸 수 있습니다print(sys.stdin.read())
write
는 반환 하지 않기 때문에 None
설정 크기는 절대로 1 ( =len(set([None]))
) 보다 클 수 없습니다.
stdin에서 읽은 후 다음과 같이 입력을 "데이터"에 저장할 수 있습니다 .
data = ""
for line in sys.stdin:
data += line
data = sys.stdin.read()
반복되는 문자열 연결 문제없이 으로 동일한 작업을 수행 할 수 있습니다 .
에서 읽기 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()
내가 해결해야 할 문제
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)
select
호출 될 때 입력이 거의 "준비"되지 않기 때문에 터미널에서 대화식 입력에이 기능을 사용할 수 없습니다 . stdin이 느린 매체 (네트워크, CD, 테이프 등)의 파일에 연결된 경우에도 문제가 발생할 수 있습니다. "데이터를 stdin으로 전달하지 않으면 영구적으로 차단됩니다." A는 문제가 있지만, 나는 그것이 말할 것이 특징 . 대부분의 CLI 프로그램 (예 cat
:)은이 방식으로 작동하며 예상됩니다. EOF는 입력의 끝을 감지하기 위해 의존해야하는 유일한 것입니다.
파이프를 통해 소켓을 읽는 데 도움이되는 문제가있었습니다. 소켓이 닫히면 활성 루프에서 빈 문자열을 반환하기 시작했습니다. 그래서 이것은 나의 해결책입니다 (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
그리고 텔넷으로 호출하거나 브라우저를 localhost를 가리킬 수 있습니다.
이것을 고려하면:
for line in sys.stdin:
방금 python 2.7 (다른 사람의 제안에 따라)에서 매우 큰 파일을 시도했지만 위에서 언급 한 이유로 정확하게 권장하지 않습니다 (오랫 동안 아무 일도 일어나지 않습니다).
나는 약간 더 많은 pythonic 솔루션으로 끝났습니다 (그리고 더 큰 파일에서 작동합니다).
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
sys.stdin
스크립트에 명령 행 인수로 전달합니다.
sys.stdin
스크립트에 명령 줄 인수로 어떻게 전달할 수 있습니까? 인수는 문자열이고 스트림은 파일과 같은 객체이며 동일하지 않습니다.
sys.stdin
파일 - 류의 객체 인