stdin은 어떻게 읽어요?
요?stdin
? 일부 코드 골프 과제에서는 다음을 사용해야 합니다.stdin
입력에 사용합니다.
모듈을 사용합니다.
import fileinput
for line in fileinput.input():
pass
fileinput
는 명령줄 인수로 지정된 파일명으로 지정된 입력의 모든 행을 루프합니다.인수가 지정되지 않은 경우 표준 입력으로 루프합니다.
★★★★★★line
에는 후행의 줄바꿈이 포함됩니다.삭제하려면 를 사용합니다.
몇 가지 방법이 있습니다.
sys.stdin
파일 같은 오브젝트로 함수를 호출할 수 있습니다.read
★★★★★★★★★★★★★★★★★」readlines
, 다import sys
이 기능을 합니다.)사용자에게 입력을 요청하고 싶다면 Python 2.X와 Python 3에서만 사용할 수 있습니다.
Python의 I/O에 관한 Wikibook 기사도 참고가 될 것입니다.
import sys
for line in sys.stdin:
print(line)
이치노하려면 , 「」를 합니다.line.rstrip()
@"ohalloran" @"ohalloran" 입니다.
Python의 .input()
★★★★★★★★★★★★★★★★★」raw_input()
. 빌트인 함수의 Python 문서를 참조하십시오.
예를들면,
name = raw_input("Enter your name: ") # Python 2.x
또는
name = input("Enter your name: ") # Python 3
다음은 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.
파이썬에서는 stdin을 어떻게 읽습니까?
몇 가지 코드 골프 챌린지를 하려고 하는데 모두 stdin에서 입력을 받아야 합니다.Python에서는 어떻게 해야 하나요?
다음을 사용할 수 있습니다.
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에서는, 이것은 입니다.open('/dev/stdin').read()
요 - 닮았어요open(0)
, works on Python 2 and 3, but not on Windows (or even Cygwin).파이선 2및 3에서는 동작하지만 Windows(시그윈 또는).에서는 동작하지 않습니다.fileinput.input()
- 에 나열된 모든 파일의 행 위에 반복기를 반환합니다.sys.argv[1:]
또는 stdin 만약을 받지 못했습니다.또는 stdin(지정되지 않은 경우)을 지정합니다.사용법 같은 취급을 하''.join(fileinput.input())
..
둘 다 둘다요.sys
그리고 그리고.fileinput
각각, 물론 수입되야 한다.물론각각 수입해야 한다.
퀵 빨리sys.stdin
예는 파이선 2,3, Windows, UnixPython 2싱크 3, Windows, Unix와 호환되는 예와 호환됩니다.
그냥 하면 그냥 넌 필요가 있돼read
부터에서sys.stdin
"stdin" "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
더 긴 답변
2개의할 수 하고 간단한 데모를 합니다.내장된 즉 내장 기능입니다. 내장 기능입니다.input
(사용)raw_input
2) 및 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
2) Python 2) Python 2) Python의 )
함수 ''input
)print
의은, EOF File이에서, 「」, 「End Of File(End Of File)」, 「End Of File」, 「End Of File」, 「EOF」가 됩니다.EOFError
.
input
3 Python 3(또는 Python 3)의)raw_input
python 2) stdin stdin python python python python 。【stdindemo】:py::py::py:: python::pypypypypypypypypypypypypy.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가 발생합니다.이 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
★★★★★★★★★★★★★★★★★」stdout
0으로, 1로 .또한 그것들을open
Python 3 (2개의 stdout)
이 기능이 시스템에서 작동하면 더 많은 문자를 줄일 수 있습니다.
$ python -c "open(1,'w').write(open(0).read())" < inputs.txt
baz
bar
foo
의 ★★★★★★2★io.open
더 됩니다.Import는 Import에 필요한 공간을 차지합니다.
$ python -c "from io import open; open(1,'w').write(open(0).read())" < inputs.txt
foo
bar
baz
기타 의견 및 답변에 대한 대응
는 " " "를 제안합니다.''.join(sys.stdin)
sys은 메모리에 추가 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(z이후)에서 프로세스로 파일 끝 문자를 d전송해야 합니다.그리고 그 답변이 시사하는 바는print(line)
에 - 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,'\n'
print(line, end='')
2의 는 (Python 2의 ),from __future__ import print_function
를 참조해 주세요.
「 」의 실제의 유스케이스.fileinput
을 사용법
다른 사람이 제안한 답변:
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가 완료될 때까지 기다릴 수 있습니다.
그러면 표준 입력이 표준 출력에 에코됩니다.
import sys
line = sys.stdin.readline()
while line:
print line,
line = sys.stdin.readline()
다음을 사용하여 모든 송수관 위에 구축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
는 "Python"과 많은 합니다.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
교체하여 단축하다echo
이 문자열에 의해:
./above-script.py <<< 'foo bar'
2. filename 인수 사용
echo 'foo bar' > my-file.data
./above-script.py my-file.data
3. 사용방법stdin
한 파일명 「」을 사용해 주세요.-
echo 'foo bar' | ./above-script.py -
을 stdin 차단에서 stdin 차단에서 stdin 차단으로 ).EOF
한 : , 1 을 사용합니다.
import sys
input_str = sys.stdin.read()
print input_str.split()
지금까지 아무도 이 해킹에 대해 언급하지 않았다니 놀랍다.
python -c "import sys; set(map(sys.stdout.write,sys.stdin))"
에서는 python2를 할 수 .set()
단, 쪽이든 .
이것을 시험해 보세요.
import sys
print sys.stdin.read().upper()
다음 방법으로 확인합니다.
$ echo "Hello World" | python myFile.py
stdin에서 읽은 다음 다음과 같이 입력을 "데이터"에 저장할 수 있습니다.
data = ""
for line in sys.stdin:
data += line
sys.stdin
Windows에서 바이너리 데이터를 읽으려면 특히 주의해야 합니다.sys.stdin
됩니다.\r\n
로 대체하다\n
.
+ 2 가는, 해, Python 3에서는 「Windows + Python 2」를 사용합니다.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()
다음 메서드를 사용하면 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
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
솔루션에 관한 문제
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)
Python 3.8부터 할당식을 사용할 수 있습니다.
while (line := input()):
print(line)
「」를 사용하고 -c
stdin
( 보다 하게) 셸.는 python 명령어로 있습니다.python 명령어는 python 명령어로도 수$
예.
python3 -c "import sys; print(len(sys.argv[1].split('\n')))" "$(cat ~/.goldendict/history)"
그러면 goldendict의 이력 파일에서 줄 수가 카운트됩니다.
파이프로 연결된 소켓을 읽을 때 문제가 있었습니다.소켓이 닫히면 액티브루프에서 빈 문자열이 반환되기 시작합니다.이것이 저의 솔루션입니다(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
이것에 대해서:
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
os.read(0, x)
0 터 x bytes 、 stdin 、 0 。은 sys 않은입니다.
언급URL : https://stackoverflow.com/questions/1450393/how-do-i-read-from-stdin
'source' 카테고리의 다른 글
pip은 사용자 지정 버전 대신 잘못된 캐시 패키지 버전을 사용합니다. (0) | 2022.10.19 |
---|---|
여러 인수로 기능하는 함수에 목록 전달 (0) | 2022.10.19 |
Python에서 긴 줄을 여러 줄로 나눌 수 있습니까? (0) | 2022.10.19 |
MySQL에서 외래 키 열 이름 바꾸기 (0) | 2022.10.19 |
Vue.js 2: 조건부 렌더링이 작동하지 않음 (0) | 2022.10.19 |