줄 바꿈이나 공백없이 인쇄하는 방법?


1871

나는 그것을하고 싶습니다 . 이 예제에서하고 싶은 것:

C에서 :

#include <stdio.h>

int main() {
    int i;
    for (i=0; i<10; i++) printf(".");
    return 0;
}

산출:

..........

파이썬에서 :

>>> for i in range(10): print('.')
.
.
.
.
.
.
.
.
.
.
>>> print('.', '.', '.', '.', '.', '.', '.', '.', '.', '.')
. . . . . . . . . .

파이썬 print에서 \n또는 공백 을 추가하면 어떻게 피할 수 있습니까? 자, 이것은 단지 예일뿐입니다. 먼저 문자열을 만든 다음 인쇄 할 수 있다고 말하지 마십시오. 문자열을 "추가"하는 방법을 알고 싶습니다 stdout.


8
파이썬의 문자열 형식화
guettli

1
비슷한 질문이 이전에 요청 된 것 같습니다 : https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

답변:


2533

Python 3에서는 함수 의 sep=end=매개 변수를 사용할 수 있습니다 print.

문자열 끝에 줄 바꿈을 추가하지 않으려면 :

print('.', end='')

인쇄하려는 모든 함수 인수 사이에 공백을 추가하지 않으려면 다음을 수행하십시오.

print('a', 'b', 'c', sep='')

어떤 문자열이든 매개 변수에 전달할 수 있으며 두 매개 변수를 동시에 사용할 수 있습니다.

버퍼링에 문제가있는 경우 flush=True키워드 인수 를 추가하여 출력을 플러시 할 수 있습니다 .

print('.', end='', flush=True)

파이썬 2.6 및 2.7

Python 2.6 print에서 __future__모듈을 사용하여 Python 3 에서 함수를 가져올 수 있습니다 .

from __future__ import print_function

위의 Python 3 솔루션을 사용할 수 있습니다.

그러나 Python 2에서 가져온 함수 flush버전 에서는 키워드를 사용할 수 없습니다 . 파이썬 3, 구체적으로 3.3 이상에서만 작동합니다. 이전 버전에서는을 호출하여 수동으로 플러시해야합니다 . 또한이 가져 오기를 수행하는 파일의 다른 모든 인쇄 문을 다시 작성해야합니다.print__future__sys.stdout.flush()

아니면 사용할 수 있습니다 sys.stdout.write()

import sys
sys.stdout.write('.')

전화해야 할 수도 있습니다

sys.stdout.flush()

보장하기 위해 stdout즉시 플러시됩니다.


2
감사! Python 3.6.3에서 flush = True가 중요하거나 의도 한대로 작동하지 않습니다.
gunit

3
누군가 내가 왜 필요하고 flush실제로 무엇 을하는지 설명 할 수 있습니까 ?
Rishav

5
몇 개월 늦었지만 @Rishav flush에 응답하면 버퍼가 비워지고 현재 출력이 표시됩니다. 플러시가 없으면 시스템이 IO 대신 그래픽을 처리 할 때에 만 정확한 텍스트가 인쇄 될 수 있습니다. 플러시는 캐시를 "플러시"하여 텍스트를 즉시 표시합니다.
그레이트 터틀

297

Guido Van Rossum의이 링크에서 설명한 것처럼 간단해야합니다.

Re : ac / r없이 어떻게 인쇄합니까?

http://legacy.python.org/search/hypermail/python-1992/0115.html

인쇄 할 수 있지만 캐리지 리턴이 자동으로 추가되지는 않습니까?

예, 마지막 인수 뒤에 쉼표를 추가하여 인쇄하십시오. 예를 들어,이 루프는 공백으로 구분 된 행에 숫자 0..9를 인쇄합니다. 마지막 줄 바꿈을 추가하는 매개 변수가없는 "print"에 유의하십시오.

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 

99
이것은 공간으로 인해 바람직하지 않은 행동으로 질문에 구체적으로 나열되어 있습니다
Zags

87
반대로, 두 가지 이유로 답변을 삭제해야합니다. 빈 공간을 포함하여 비활성화 할 수없는 바람직하지 않은 부작용이 있으며 파이썬 3과 호환되지 않습니다 (괄호는 튜플로 변환합니다) . 나는 파이썬이 아닌 PHP에서 이런 종류의 허풍적인 구조를 기대합니다. 따라서 이것을 사용하지 않는 것이 가장 좋습니다.
Eric Leschinski

9
//, 이것은 Python 2에서 가장 간단하게 수행 할 수있는 방법이며 실제로는 오래된 OS를위한 일회성 코드가 많이 있습니다. 아마도 최상의 솔루션이 아니거나 권장되지 않을 수도 있습니다. 그러나 StackOverflow의 가장 큰 장점 중 하나는 어떤 이상한 트릭이 있는지 알려줍니다. KDP, @Eric Leschinski의 말에 대한 빠른 경고를 맨 위에 포함 하시겠습니까? 결국 이해가됩니다.
Nathan Basanese 2009 년

23
@nathanbasanese 단순하거나 그렇지 않다면, asker가 명시 적으로 원하지 않는 부작용 있습니다. 공감.
Shadur

8
270은 질문에 구체적 으로 답변 하지 않는 답변을지지합니다. 좋은 일을하는 사람들. 잘 했어.
Cylindric

168

참고 :이 질문의 제목은 "파이썬에서 어떻게 printf?"

사람들은 제목을 기반으로 여기를 찾게 될 수도 있기 때문에 Python은 printf 스타일 대체도 지원합니다.

>>> strings = [ "one", "two", "three" ]
>>>
>>> for i in xrange(3):
...     print "Item %d: %s" % (i, strings[i])
...
Item 0: one
Item 1: two
Item 2: three

문자열 값을 직접 곱할 수 있습니다.

>>> print "." * 10
..........

10
실제로 요점을 놓치고 있습니다. :) 이미 그 질문에 대한 큰 대답이 있었기 때문에 나는 유용한 것으로 입증 될 수있는 몇 가지 관련 기술을 자세히 설명하고있었습니다.
Beau

8
질문의 제목을 바탕으로이 답변이 C / C ++에서 printf를 일반적으로 사용하는 방법과 더 유사하다고 생각합니다.
Dan

16
이것은 질문의 제목에 답하지만 본문은 아닙니다. 그것은 내가 찾던 것을 나에게 제공했다. :)
ayman

2
그것은 질문에 대한 답변이 아닙니다
Vanuan

4
@Vanuan, 나는 대답의 맨 아래에서 질문의 제목이 어느 시점에서 바뀌 었다고 설명했습니다. :)
Beau

93

python2.6 +에 python3 스타일 인쇄 기능을 사용하십시오 (동일한 파일에서 기존 키워드로 인쇄 된 명령문도 손상시킵니다).

# for python2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

모든 python2 인쇄 키워드를 망치지 않으려면 별도의 printf.py파일을 만드십시오.

# printf.py

from __future__ import print_function

def printf(str, *args):
    print(str % args, end='')

그런 다음 파일에서 사용하십시오.

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

printf 스타일을 보여주는 더 많은 예제

printf('hello %s', 'world')
printf('%i %f', 10, 3.14)
#hello world10 3.140000

39

같은 줄에 인쇄하는 방법 :

import sys
for i in xrange(0,10):
   sys.stdout.write(".")
   sys.stdout.flush()

27

새로운 (Python 3.x부터) print함수에는 end끝 문자를 수정할 수 있는 선택적 매개 변수가 있습니다.

print("HELLO", end="")
print("HELLO")

산출:

안녕 안녕

도 있습니다 sep구분을 위해 :

print("HELLO", "HELLO", "HELLO", sep="")

산출:

안녕 안녕 안녕

Python 2.x에서 이것을 사용하려면 파일 시작 부분 에 이것을 추가 하십시오.

from __future__ import print_function


1
"sep"는 무엇을합니까?
McPeppr

1
@ McPeppr 나는 이것이 오래된 것을 알고 있지만 그럼에도 불구하고 더 명확하게 답변을 편집했습니다. 바로 확인해보세요.
TheTechRobo36414519

편집 해 주셔서 감사합니다. sep가 유용 할 것입니다. 지금까지 sep.join (list)을 사용하여 목록의 요소를 사이에 구분 기호로 연결했습니다. csv 파일 작성에
적합

21

functools.partial을 사용하여 printf라는 새로운 함수 만들기

>>> import functools

>>> printf = functools.partial(print, end="")

>>> printf("Hello world\n")
Hello world

기본 매개 변수로 함수를 쉽게 감쌀 수 있습니다.


16

기능 ,끝에 추가 하면 print새 줄에 인쇄되지 않습니다.


1
//, 이것은 실제로 아무것도 출력하지 않게 만들었습니다. 그런 다음 stackoverflow.com/a/493500/2146138 과 같이 끝에 인수없이 다른 print 문을 추가 할 필요가 없습니까? 이 답변을 reeeally short 2 또는 3 줄 예제로 편집 하시겠습니까?
Nathan Basanese 2016 년

3
OP는 공간을 추가하고 싶지 않다
pppery

2
질문에 대답하지 않았습니다. 공백이 없습니다.
shrewmouse

이것은 더 이상 Python 2.x에서 작동하지 않으며 OP가 원했던 것의 절반 만 응답합니다. 16은 왜 투표를합니까?
TheTechRobo36414519

12

파이썬 3 이상에서는 print함수입니다. 전화 할 때

print('hello world')

파이썬은 그것을 번역합니다

print('hello world', end='\n')

end원하는대로 변경할 수 있습니다 .

print('hello world', end='')
print('hello world', end=' ')

8

파이썬 2.6 이상 :

from __future__ import print_function # needs to be first statement in file
print('.', end='')

파이썬 3 :

print('.', end='')

파이썬 <= 2.5 :

import sys
sys.stdout.write('.')

파이썬 2에서 인쇄 할 때마다 여분의 공간이 있으면

print '.',

파이썬 2에서 오해의 소지 - 피하십시오 :

print('.'), # avoid this if you want to remain sane
# this makes it look like print is a function but it is not
# this is the `,` creating a tuple and the parentheses enclose an expression
# to see the problem, try:
print('.', 'x'), # this will print `('.', 'x') `

8

당신은 시도 할 수 있습니다:

import sys
import time
# Keeps the initial message in buffer.
sys.stdout.write("\rfoobar bar black sheep")
sys.stdout.flush()
# Wait 2 seconds
time.sleep(2)
# Replace the message with a new one.
sys.stdout.write("\r"+'hahahahaaa             ')
sys.stdout.flush()
# Finalize the new message by printing a return carriage.
sys.stdout.write('\n')

5

python3에서 다음과 같이 동일한 작업을 수행 할 수 있습니다.

#!usr/bin/python

i = 0
while i<10 :
    print('.',end='')
    i = i+1

그리고 그것을 실행 python filename.py하거나python3 filename.py


5

나는 최근에 같은 문제가 있었다.

나는 그것을함으로써 그것을 해결했다 :

import sys, os

# reopen stdout with "newline=None".
# in this mode,
# input:  accepts any newline character, outputs as '\n'
# output: '\n' converts to os.linesep

sys.stdout = os.fdopen(sys.stdout.fileno(), "w", newline=None)

for i in range(1,10):
        print(i)

이것은 유닉스와 윈도우 모두에서 작동합니다 ... macosx에서 테스트하지 않았습니다 ...

hth


2
휴식sys.__stdout__
pppery

4

@lenooh는 내 쿼리를 만족 시켰습니다. 'python suppress newline'을 검색하는 동안이 기사를 발견했습니다. Raspberry Pi에서 IDLE3을 사용하여 PuTTY 용 Python 3.2를 개발하고 있습니다. PuTTY 명령 줄에 진행률 표시 줄을 만들고 싶었습니다. 페이지가 스크롤되는 것을 원하지 않았습니다. 나는 프로그램이 중단되지 않았거나 메리 무한 루프에서 점심 식사로 보내지 않았다는 것을 사용자가 다시 놀라게하지 못하게하는 수평선을 원했습니다. 하지만 시간이 좀 걸릴 수 있습니다. ' 대화 형 메시지-텍스트의 진행률 표시 줄과 같습니다.

print('Skimming for', search_string, '\b! .001', end='')'001'을 닦아내 및 기간의 라인을 연장 ⌫⌫⌫ rubout 같이 세 백 스페이스를 인쇄 할 다음 화면 쓰기 다음 기간 준비하여 메시지를 초기화한다. search_string앵무새가 사용자 입력을 한 후 , 텍스트 \b!의 느낌표 가 문장 search_string의 공간을 뒤로 print()밀도록 문장 부호를 잘라내어 구두점을 올바르게 배치합니다. 그다음에는 시뮬레이션하고있는 '진행률 표시 줄'의 공백과 첫 번째 '점'이 이어집니다. 불필요하게, 메시지는 또한 페이지 번호로 시작하여 (제로 0으로 3의 길이로 포맷 됨) 사용자에게 진행 상황이 처리되고 있음을 사용자에게 통지합니다. 권리.

import sys

page=1
search_string=input('Search for?',)
print('Skimming for', search_string, '\b! .001', end='')
sys.stdout.flush() # the print function with an end='' won't print unless forced
while page:
    # some stuff…
    # search, scrub, and build bulk output list[], count items,
    # set done flag True
    page=page+1 #done flag set in 'some_stuff'
    sys.stdout.write('\b\b\b.'+format(page, '03')) #<-- here's the progress bar meat
    sys.stdout.flush()
    if done: #( flag alternative to break, exit or quit)
        print('\nSorting', item_count, 'items')
        page=0 # exits the 'while page' loop
list.sort()
for item_count in range(0, items)
    print(list[item_count])
#print footers here
 if not (len(list)==items):
    print('#error_handler')

진행률 표시 줄에 고기가 sys.stdout.write('\b\b\b.'+format(page, '03'))있습니다. 먼저 왼쪽으로 지우려면 '\ b \ b \ b'를 ⌫⌫⌫ rubout으로하여 세 개의 숫자 위에 커서를 백업하고 진행률 막대 길이에 추가 할 새 마침표를 삭제합니다. 그런 다음 지금까지 진행 한 페이지의 세 자리를 씁니다. sys.stdout.write()전체 버퍼 또는 출력 채널이 닫힐 때까지 기다리 므로 sys.stdout.flush()즉시 쓰기가 수행됩니다. sys.stdout.flush()끝에 print()생략되어 내장되어print(txt, end='' ) . 그런 다음 코드는 평범한 시간 집약적 작업을 반복하면서 여기로 돌아와 세 자리를 지우고 마침표를 추가하고 세 자리를 다시 쓰고 증분하여 더 이상 인쇄하지 않습니다.

닦고 다시 세 자리는 필요한 것은 아니다 - 그것은 모범을 단지 번창의 sys.stdout.write()print(). 마침표를 사용하여 쉽게 마침표를 작성하고 공백이나 줄 바꿈없이 마침표 막대를 한 번 더 길게 인쇄하여 3 개의 백 슬래시-b ⌫ 백 스페이스 (물론 서식이 지정된 페이지 수도 쓰지 않음)를 잊을 수 있습니다.sys.stdout.write('.'); sys.stdout.flush() 쌍.

Raspberry Pi IDLE3 Python 쉘은 백 스페이스를 ⌫ 루 아웃으로 인식하지 않고 대신 공백을 인쇄하여 분수의 명백한 목록을 생성합니다.

— (o = 8> 위즈


4

위의 모든 답변이 정확하다는 것을 알 수 있습니다. 그러나 항상 "end = ''"매개 변수를 항상 작성하는 바로 가기를 만들고 싶었습니다.

당신은 같은 기능을 정의 할 수 있습니다

def Print(*args,sep='',end='',file=None,flush=False):
    print(*args,sep=sep,end=end,file=file,flush=flush)

모든 수의 매개 변수를 승인합니다. 심지어 파일, 플러시 등과 같은 다른 모든 매개 변수를 동일한 이름으로 허용합니다.


그것은 *arg시작 되지 않고 (파이썬 2.7) 불만을 제기 하고 마지막에 넣는 것이 실행되었지만 완전히 올바르게 작동하지 않았습니다. 나는 단지 취한 함수를 정의한 Print(*args)다음 print with를 호출했다 sep='', end=''. 그리고 지금은 내가 원하는대로 작동합니다. 아이디어에 대한 하나의 공감대.
Otzen

4

이러한 답변 중 많은 부분이 약간 복잡해 보입니다. Python 3.x에서는 간단히 다음을 수행하십시오.

print(<expr>, <expr>, ..., <expr>, end=" ")

end의 기본값은 "\n"입니다. 우리는 단순히 공백으로 바꾸거나 end=""(공간 없음)을 사용 하여 printf정상적으로 하는 일을 할 수 있습니다 .


3

for 루프로 무언가를 인쇄하고 싶지만 매번 새 줄로 인쇄하고 싶지는 않습니다. 예를 들면 다음과 같습니다.

 for i in range (0,5):
   print "hi"

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

그러나 당신은 이것을 다음과 같이 인쇄하기를 원합니다 : 안녕 안녕 안녕 안녕 안녕 안녕 오른쪽 ???? "hi"를 인쇄 한 후 쉼표를 추가하십시오.

예:

for i in range (0,5): print "hi", OUTPUT: hi hi hi hi hi


5
아니, 영업 이익은 하이 하이 하이 하이 하이되지, hihihihihi 원
쿨 창 던지기

1

또는 다음과 같은 기능이 있습니다.

def Print(s):
   return sys.stdout.write(str(s))

그런 다음 :

for i in range(10): # or `xrange` for python 2 version
   Print(i)

출력 :

0123456789

0
for i in xrange(0,10): print '\b.',

이것은 2.7.8 및 2.5.2 (각각 캐노피 및 OSX 터미널)에서 작동했으며 모듈 가져 오기 또는 시간 이동이 필요하지 않습니다.


8
백 스페이스 문자를 표준 출력으로 인쇄합니다. 그것은 수도 보면 표준 출력이 터미널로 발생하는 경우 정확하지만,이 파일로 재 않다면 파일은 제어 문자를 포함 할 것이다.
Keith Thompson

1
사실, 나는 누군가가 저급 진행률 표시 줄 이외의 다른 용도로 이것을 사용하고 싶다고 상상할 수 없다 ...
tyersome

1
그럼에도 불구하고, 파이썬 코드는 문제의 C 코드와 동일한 기능을 수행하지 않습니다.
Keith Thompson

sys.stdout.isatty()파일로 리디렉션되지 않은 경우 테스트 할 수 있습니다 .
fcm

0

이를 수행하는 일반적인 두 가지 방법이 있습니다.

Python 3.x에서 줄 바꿈없이 인쇄

print 문 뒤에 아무것도 추가하지 않고 다음과 end='' 같이 사용하여 '\ n'을 제거하십시오 .

>>> print('hello')
hello  # appending '\n' automatically
>>> print('world')
world # with previous '\n' world comes down

# solution is:
>>> print('hello', end='');print(' world'); # end with anything like end='-' or end=" " but not '\n'
hello world # it seem correct output

루프의 또 다른 예 :

for i in range(1,10):
    print(i, end='.')

Python 2.x에서 줄 바꿈없이 인쇄

후행 쉼표를 추가하면 인쇄 후 무시 \n됩니다.

>>> print "hello",; print" world"
hello world

루프의 또 다른 예 :

for i in range(1,10):
    print "{} .".format(i),

이것이 도움이되기를 바랍니다. 이 링크 를 방문하십시오 .


공간은 어떻습니까?
shrewmouse

end=" "예를 들면 다음과 같이 사용하십시오 : print ( 'hello', end = '' "); print ( 'world')
susan097

2.7 솔루션은 공간을 제거하지 않습니다.
shrewmouse

공백이 아닌 '\ n'을 제거한다고 언급했지만 공백은 기본적으로 python2입니다. 무엇을보고이 외모 : print 'hello' ;print'there'paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

그렇기 때문에 귀하의 답변이 다운 투표되었습니다. "줄 바꿈이나 공백없이 인쇄하는 방법?"이라는 질문에 대답하지 않았습니다. 2.x에 ​​대한 귀하의 답변은 질문에 대한 답변이 아닙니다. 3.0에 대한 답변은 9 년 전에 게시 된 다른 답변들과 동일합니다. 간단히 말해서,이 답변은 커뮤니티에 유용한 것을 추가하지 않으므로 삭제해야합니다.
shrewmouse

-3

... 라이브러리를 가져올 필요가 없습니다. 삭제 문자를 사용하십시오.

BS=u'\0008' # the unicode for "delete" character
for i in range(10):print(BS+"."),

이것은 줄 바꿈과 공백을 제거합니다 (^ _ ^) *

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.