source

stdin은 어떻게 읽어요?

gigabyte 2022. 10. 19. 21:06
반응형

stdin은 어떻게 읽어요?

요?stdin? 일부 코드 골프 과제에서는 다음을 사용해야 합니다.stdin입력에 사용합니다.

모듈을 사용합니다.

import fileinput

for line in fileinput.input():
    pass

fileinput 는 명령줄 인수로 지정된 파일명으로 지정된 입력의 모든 행을 루프합니다.인수가 지정되지 않은 경우 표준 입력으로 루프합니다.

★★★★★★line에는 후행의 줄바꿈이 포함됩니다.삭제하려면 를 사용합니다.

몇 가지 방법이 있습니다.

  • sys.stdin 파일 같은 오브젝트로 함수를 호출할 수 있습니다.read ★★★★★★★★★★★★★★★★★」readlines, 다 import sys이 기능을 합니다.)

  • 사용자에게 입력을 요청하고 싶다면 Python 2.X와 Python 3에서만 사용할 수 있습니다.

  • 명령줄 옵션만 읽고 싶은 경우 sys.argv 목록을 통해 액세스할 수 있습니다.

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_input2) 및 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.readPython 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_input2) 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_inputpython 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

도움말입니다.inputPython 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로 .또한 그것들을openPython 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.stdinWindows에서 바이너리 데이터를 읽으려면 특히 주의해야 합니다.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)

「」를 사용하고 -cstdin( 보다 하게) 셸.는 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

반응형