코드 골프]1 챌린지 중 일부를 수행하려고 하는데 모두 stdin
에서 입력을 가져와야 합니다. 파이썬에서 이 입력을 얻으려면 어떻게 해야 하나요?
몇 가지 방법이 있습니다.
sys.stdin
은 파일과 같은 객체로, 모든 것을 읽거나 모든 것을 읽고 자동으로 줄 바꿈으로 나누고 싶은 경우 read
또는 readlines
함수를 호출할 수 있습니다. (이 기능을 사용하려면 import sys
가 필요합니다.)
사용자에게 입력을 '프롬프트'하려면 파이썬 2.X에서는 raw_input
을, 파이썬 3에서는 input
만 사용하면 됩니다.
실제로 명령줄 옵션만 읽으려는 경우 sys.argv 목록을 통해 액세스할 수 있습니다.
파이썬의 I/O에 관한 이 위키북 문서]3도 유용한 참고 자료가 될 것입니다.
"'페이턴 import sys
선 () 의 시s.스트딘: 보기인쇄 (선) "'
참고로 이 끝에 개행 문자를 포함할 것이다. 줄 바꿈 결국 ' ()' 를 사용하여 지루려면 레안드로스트리프 @brittohalloran 밝혔다.
다음은 파이썬 배우기의 내용입니다:
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.
해답은 제안한 기타:
for line in sys.stdin:
print line
하지만 매우 단순하고 파이썬 비활성화해야 때까지 기다리는 줄이 EOF 를 반복할 수 있다고 스크립트입니다 시작하기 전에 입력입니다.
즉, '꼬리' (myscript.py) - f error_log 라인이 않을 것으로 보고 있다.
이러한 올바른 스크립트입니다 览侩 荤례 다음과 같습니다.
while 1:
try:
line = sys.stdin.readline()
except KeyboardInterrupt:
break
if not line:
break
print line
>. # 어떻게 읽을 stdin 의 파이썬?
사용할 수 있습니다.
그냥 '읽기' 에서 '할 경우, 예를 들어 파이프 데이터를 시s.스트딘 stdin:
$ echo foo | python -c "import sys; print(sys.stdin.read())"
foo
We can see that '시s.스트딘' 가 기본 텍스트 모드: "'파이썬 > > >;; import sys > > >;; 시s.스트딘 name = & # 39, & # 39 stdin> < _io.TextIOWrapper <;;; # 39, & # 39, r& 모드 = # 39, & # 39 인코딩입니다 = UTF-8& >; "'
You have a ',' 라고 쓸 수 있고, 그 파일 및 파일 린퍼츠.t스트 동의하십시오 뒤로를 아웃해야:
python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt
$ python -c "print('foo\nbar\nbaz')" > inputs.txt
$ python -c "import sys; sys.stdout.write(sys.stdin.read())" < inputs.txt
foo
bar
baz
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.
'입' 은 내장 함수를 줄 바꿈, 이는 표준 입력으로부터 판독합니다 최대 빼앗아 (보완 '' 는 기본적으로 인쇄하십시오 있는 줄 바꿈.) 이런 점을 얻을 때까지 EOF (파일 끝) 에서 '이' 레오퍼러 제기한다. 따라서 here& # 39 의 입력 방식을 사용할 수 있습니다 (또는 'raw_input' 의 파이썬 2) '3' 의 파이썬 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
다시 ',' 에서 이 제품을 할말이다 본질적으로 전까지 판독합니다 개행 문자 입력 및 스트립 '는' 인쇄하십시오 줄 바꿈. 그래서 그들은 그들의 수정을 입력입니다 수정하십시오 동안 모두 취소. (있기 때문에, 기본적으로 각 other& # 39 의 보수.) '언제' 이 제기되고 있는 문자 입력 파일 끝 가져옵니다 레오퍼러 저희에게는힘과 무시됨 그리곤요 프로그램을 종료합니다. 리눅스 / 유닉스 및 ideastorm. 파이프 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(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.
Here we make a 데모 스크립트입니다 시s.스트딘 사용하여 ''. 이 파일 류 효율적으로 사용할 수 있는 파일 류 반복할 객체인지 로케이터로 오버클로킹된 반복자가. 보완 방법을 사용하여 간단히 쓸 수 있다 '에서 stdout 이 입력입니다 시s.스트더스트라이트':
$ python -c "print('import sys\nfor line in sys.stdin:\n sys.stdout.write(line)')" > stdindemo2.py
다시 인쇄하십시오 아웃하려면 smartupdate 오른쪽맞춤 보입니다.
$ 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 로 파이썬 3 아닌 2, # 39, & # 39 는 우리가 w& 필요한데, 메모 쓰기 위해 stdout). 만약 이 시스템에서 작동하는 것 이상의 문자가 면도 오프하도록.
$ python -c "open(1,'w').write(open(0).read())" < inputs.txt
baz
bar
foo
$ python -c "from io import open; open(1,'w').write(open(0).read())" < inputs.txt
foo
bar
baz
'& # 39, & # 39 한 주석문입니다 제안됩니다 스타인 (시s.스트딘)' 는 골프 하지만, 실제로 that& # 39 의 파이썬 구성형 시s.스트딘드프리드 () - 이상 만들어야 합니다 목록에 추가 메모리 (that& # 39 의 스트리요린 작동됨 목록이 않을 때 '어떻게') - 대비를 위해.
''.join(sys.stdin)
sys.stdin.read()
상위 오토메이티드 제안됩니다:
import fileinput
for line in fileinput.input():
pass
그러나 이후 시s.스트딘 ',' s just # 39 는 파일 API 를 포함, that& 반복자가 포로토콜 다음과 같습니다.
import sys
for line in sys.stdin:
pass
'무언가' 를 바탕으로 앤워스 시s.스트딘 사용할 수도 있습니다 다음과 같은 주장을 하나 이상의 파일을 읽을 수 있는 경우 인수 및 폴백하는 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 / 유닉스 프로그램에 그렙' 와 'sed'.
예 호환됩니까 파이썬 버전을 모두 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] (https://stackoverflow.com/q/25797252/938111) [구체화하십시오] (https://unix.stackexchange.com/a/80368/13999):
./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 -
다음 코드 칩 도움이 될 것이다 (EOF) ',' 모든 것을 막는 것이라고 검토완료 stdin 하나의 문자열):
import sys
input_str = sys.stdin.read()
print input_str.split()
그러나 ',' 시s.스트딘 이진 데이터를 읽을 수 있기 때문에 추가 합니다 검토완료 windows에서 신중한 '지금' 연 '시s.스트딘 텍스트 모드' 로 교체하는 것 '' \r\n 손상됨 \n '.
이 솔루션은 Windows + 파이썬 2 는 이진 모드를 설정할 수 있으며, '3' 의 경우 검출하였습니다 시s.스트딘스부퍼 사용할 수 있다.
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)
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)
이 때 몇 가지 문제를 갖고 일하기 판독값 그러는데 소켓을 통해 얻을 수 있도록 한다. 소켓 attaboy 단힌 시작했을 때 다시 빈 문자열을 능동 루프지 이게 내 it 솔루션 (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
와 함께 이 브라우저를 로컬호스트 12345 가공할지 지점임 텔넷에 문의할 수 있습니다
이에 대해:
'선' 에 sys.stdin:
그냥 노력은 한 것 같습니다 (# 39 의 제안을 다음과 같은 사람이 else&) 를 파이썬 2.7 의 대용량 파일, 쉐퍼드도 don& 추천합니까 해버린다는거, 위에 언급한 이유에 대해서는 정확히 # 39, t (아무 일도 오랫동안).
내가 더 많은 파이썬 솔루션 (및 작동하잖아 켜짐이 큰 파일) 로 약간 위로 끝났다.
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