[python] sys.stdout.write와 print의 차이점은 무엇입니까?

sys.stdout.write()선호 되는 상황이 있습니까?print 있습니까?

( 예 : 더 나은 성능; 더 이해하기 쉬운 코드)



답변

print입력을 형식화하고 (수정 가능하지만 기본적으로 인수와 개행 문자 사이에 공백이있는) 얇은 래퍼 일 뿐이며 지정된 객체의 쓰기 함수를 호출합니다. 기본적으로이 객체는입니다 sys.stdout. 그러나 “chevron”양식을 사용하여 파일을 전달할 수 있습니다. 예를 들면 다음과 같습니다.

print >> open('file.txt', 'w'), 'Hello', 'World', 2+3

참조 : https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement


Python 3.x에서는 print함수가되지만 인수 sys.stdout덕분에 다른 것을 전달할 수 있습니다 file.

print('Hello', 'World', 2+3, file=open('file.txt', 'w'))

https://docs.python.org/3/library/functions.html#print를 참조 하십시오.


Python 2.6 이상에서는 print여전히 명령문이지만 다음과 같은 함수로 사용할 수 있습니다.

from __future__ import print_function

업데이트 : Bakuriu는 인쇄 기능과 인쇄 명령문 사이에 (더 일반적으로 함수와 명령문 사이에) 작은 차이가 있다고 지적했다.

인수를 평가할 때 오류가 발생하는 경우 :

print "something", 1/0, "other" #prints only something because 1/0 raise an Exception

print("something", 1/0, "other") #doesn't print anything. The function is not called


답변

print먼저 객체를 문자열로 변환합니다 (아직 문자열이 아닌 경우). 또한 줄의 시작이 아닌 끝에 줄 바꿈 문자가 아닌 경우 객체 앞에 공백을 넣습니다.

사용할 때 stdout 객체를 직접 문자열로 변환해야합니다 (예 : “str”을 호출하여). 개행 문자가 없습니다.

그래서

print 99

다음과 같습니다.

import sys
sys.stdout.write(str(99) + '\n')


답변

내 질문하는 경우가 있는지 여부이다
sys.stdout.write()하는 것이 바람직하다
print

며칠 전에 스크립트 개발을 마친 후에 유닉스 서버에 업로드했습니다. 내 디버그 메시지는 모두 print문을 사용했지만 서버 로그 에는 표시 되지 않습니다.

sys.stdout.write대신 필요할 수 있습니다 .


답변

다음 은 Mark Lutz의 Learning Python 의 책을 기반으로하는 몇 가지 샘플 코드입니다 .

import sys
temp = sys.stdout                 # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123")               # nothing appears at interactive prompt
print("another line")             # again nothing appears. it's written to log file instead
sys.stdout.close()                # ordinary file object
sys.stdout = temp                 # restore print commands to interactive prompt
print("back to normal")           # this shows up in the interactive prompt

텍스트 편집기에서 log.txt를 열면 다음이 나타납니다.

testing123
another line


답변

sys.stdout인쇄 대신 원하는 상황이 하나 이상 있습니다.

예를 들어 진행률 표시 줄이나 상태 메시지를 그리는 동안 다음 줄로 이동하지 않고 줄을 덮어 쓰려면 다음 과 같이 반복해야합니다.

Note carriage return-> "\rMy Status Message: %s" % progress

그리고 print는 개행을 추가하기 때문에을 사용하는 것이 좋습니다 sys.stdout.


답변

내 질문하는 경우가 있는지 여부이다 sys.stdout.write()하는 것이 바람직하다print

파일과 stdout 모두에 쓸 수있는 명령 줄 응용 프로그램을 작성하는 경우 편리합니다. 다음과 같은 작업을 수행 할 수 있습니다.

def myfunc(outfile=None):
    if outfile is None:
        out = sys.stdout
    else:
        out = open(outfile, 'w')
    try:
        # do some stuff
        out.write(mytext + '\n')
        # ...
    finally:
        if outfile is not None:
            out.close()

그것은 당신이 with open(outfile, 'w') as out:패턴을 사용할 수 없다는 것을 의미 하지만 때로는 그만한 가치가 있습니다.


답변

2.x에서이 print명령문은 사용자가 제공 한 내용을 사전 처리하여 경로를 따라 문자열로 바꾸고 구분 기호와 줄 바꾸기를 처리하고 파일로의 리디렉션을 허용합니다. 3.x는 함수로 변환하지만 여전히 동일한 책임이 있습니다.

sys.stdout 문자열이나 그 줄을 따라 뭔가를 쓰는 방법이있는 파일 또는 파일과 같습니다.