Как печатать без перевода строки или пробела?


1873

Я хотел бы сделать это в , Что я хотел бы сделать в этом примере в:

В С:

#include <stdio.h>

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

Вывод:

..........

В Python:

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

В Python printдобавит \nили пробел, как я могу избежать этого? Теперь это просто пример, не говорите мне, что я могу сначала создать строку, а затем распечатать ее. Я хотел бы знать, как "добавлять" строки в stdout.


8
Для тех, кто ищет документацию по python для форматирования строки: docs.python.org/library/stdtypes.html#string-formatting
guettli

1
Похоже, что аналогичный вопрос был задан ранее: https://stackoverflow.com/q/255147/9325817
Р.

Ответы:


2536

В Python 3 вы можете использовать sep=и end=параметры printфункции:

Чтобы не добавлять новую строку в конец строки:

print('.', end='')

Чтобы не добавлять пробел между всеми аргументами функции, которые вы хотите вывести:

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

Вы можете передать любую строку любому параметру, и вы можете использовать оба параметра одновременно.

Если у вас возникли проблемы с буферизацией, вы можете очистить вывод, добавив flush=Trueключевое слово аргумент:

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

Python 2.6 и 2.7

Из Python 2.6 вы можете импортировать printфункцию из Python 3, используя __future__модуль :

from __future__ import print_function

который позволяет использовать решение Python 3 выше.

Однако обратите внимание, что flushключевое слово недоступно в версии printфункции, импортированной из __future__Python 2; он работает только в Python 3, а точнее 3.3 и позже. В более ранних версиях вам все равно нужно будет выполнить сброс вручную с помощью вызова 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и что оно делает на самом деле?
Ришав

5
Это несколько месяцев спустя, но для ответа @Rishav flush очищает буфер и отображает вывод прямо сейчас. Без очистки вы можете в конечном итоге распечатать ваш точный текст, но только тогда, когда система приступит к обработке графики вместо ввода-вывода. Flush делает текст видимым сразу же после «очистки» кэша.
Большая Черепаха

297

Это должно быть так просто, как описано по этой ссылке Гвидо Ван Россумом:

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
Это конкретно указано в вопросе как нежелательное поведение из-за пробелов
Загс

87
Напротив, ответ должен быть удален по двум причинам: у него есть нежелательные побочные эффекты, которые вы не можете отключить (включая дополнительные пробелы), и он не совместим с Python 3 (скобки принудительно преобразуют в кортеж) , Я ожидаю, что такие неаккуратные конструкции из PHP, а не Python. Так что лучше никогда не использовать это.
Эрик Лещинский,

9
// Это самый простой способ сделать это в Python 2, хотя для действительно старых ОС существует МНОГО разового кода. Вероятно, не лучшее решение или даже рекомендуется. Тем не менее, одним из больших преимуществ StackOverflow является то, что он позволяет нам узнать, какие уловки существуют. ДПК, не могли бы вы включить быстрое предупреждение в верхней части о том, что сказал @Eric Leschinski? В конце концов, это имеет смысл.
Натан Басанезе

23
@nathanbasanese Просто или нет, у него есть побочный эффект, который спрашивающий явно не хочет . Downvoted.
Шадур

8
270 голосов за ответ, который конкретно не отвечает на вопрос. Хорошая работа, голосование людей. Хорошая работа.
Цилиндрический

168

Примечание: заголовок этого вопроса был что-то вроде «Как напечатать в Python?»

Поскольку люди могут приходить сюда в поисках по названию, 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
Действительно, это упускает суть. :) Поскольку на этот вопрос уже был отличный ответ, я просто разработал некоторые связанные с ним методы, которые могут оказаться полезными.
Бо

8
Основываясь на названии вопроса, я считаю, что этот ответ является более подходящим аналогом тому, как обычно используется printf в C / C ++
Дан

16
Это отвечает на название вопроса, но не тела. Тем не менее, это дало мне то, что я искал. :)
айман

2
это не ответ на вопрос
Вануан

4
@ Вануан, я объяснил в нижней части своего ответа, что название вопроса изменилось в какой-то момент. :)
Бо

93

Используйте функцию печати в стиле python3 для python2.6 + (также нарушит все существующие операторы печати с ключевыми словами в том же файле.)

# 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

Новая printфункция ( начиная с Python 3.x) имеет необязательный endпараметр, который позволяет изменять конечный символ:

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

Вывод:

ПРИВЕТ ПРИВЕТ

Там же sepдля разделителя:

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

Вывод:

ЗДРАВСТВУЙТЕ ЗДРАВСТВУЙТЕ ЗДРАВСТВУЙТЕ

Если вы хотите использовать это в Python 2.x, просто добавьте это в начале вашего файла:

from __future__ import print_function


1
что делает "сеп"?
МакПеппр

1
@ McPeppr Я знаю, что это старый, но я все же отредактировал ответ для большей ясности. Проверь это сейчас.
TheTechRobo36414519

Спасибо за редактирование. Сеп пригодится. До сих пор я использовал sep.join (list) для объединения элементов списка с разделителем между ними - идеально подходит для записи csv-файлов
McPeppr

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 ? Желаете ли вы отредактировать этот ответ с помощью действительно короткого примера из двух или трех строк?
Натан Басанезе

3
ОП не хочет
добавлять

2
Не ответил на вопрос. Пробелов нет
уборщица

Это больше не работает в Python 2.x и отвечает только на половину того, что хотел OP. Почему 16 голосов?
TheTechRobo36414519

12

В Python 3+ printэто функция. Когда вы звоните

print('hello world')

Python переводит это

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

Вы можете изменить endна что угодно.

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

8

Python 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('.')

если дополнительное пространство в порядке после каждой печати, в Python 2

print '.',

вводить в заблуждение в Python 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)

это работает как на Unix, так и на Windows ... не проверял его на Macosx ...

НТН


2
Перерывыsys.__stdout__
pppery

4

@lenooh удовлетворил мой запрос. Я обнаружил эту статью во время поиска 'python suppress newline'. Я использую IDLE3 на Raspberry Pi для разработки Python 3.2 для PuTTY. Я хотел создать индикатор выполнения в командной строке PuTTY. Я не хотел, чтобы страница прокручивалась. Я хотел, чтобы горизонтальная линия убедила пользователя в том, что программа не остановилась и не была отправлена ​​на ланч по бесконечной бесконечной петле - как просьба «оставь меня, у меня все хорошо, но это может занять некоторое время. интерактивное сообщение - как индикатор выполнения в тексте.

print('Skimming for', search_string, '\b! .001', end='')Инициализирует сообщение по подготовке к следующему экрану-записи, который будет печатать три забоя , как ⌫⌫⌫ rubout , а затем период, вытирания «001» и расширяя линию периодов. После того, как search_stringпопугай введен пользователем, \b!восклицательный знак моего search_stringтекста обрезается так, чтобы он возвышался над пробелом, который в print()противном случае приводит к правильной расстановке знаков препинания. Затем следует пробел и первая «точка» «индикатора выполнения», который я моделирую. Излишне, сообщение также тогда заполняется номером страницы (отформатированный в длину три с ведущими нулями), чтобы заметить от пользователя, что прогресс обрабатывается и который также будет отражать количество периодов, которые мы позже построим к правильно.

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(). Вы также можете легко заштриховать точку и забыть о трех причудливых обратных символах backslash-b ((конечно, не записывая и отформатированное количество страниц), просто печатая строку периода длиннее на единицу каждый раз - без пробелов и новых строк, используя толькоsys.stdout.write('.'); sys.stdout.flush() пара.

Обращаем ваше внимание, что оболочка Python Raspberry Pi IDLE3 не принимает символ возврата на обратную сторону как ⌫ rubout, а вместо этого печатает пробел, создавая вместо этого видимый список дробей.

- (o = 8> мудрый


4

Вы заметите, что все вышеприведенные ответы верны. Но я хотел сделать ярлык, чтобы всегда писать параметр "end = ''" в конце.

Вы можете определить функцию как

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

Было бы принять все количество параметров. Даже он будет принимать все другие параметры, такие как file, flush и т. Д. И с тем же именем.


Он не запускается, он жалуется, что *argнаходится в начале (python 2.7), а установка его в конце действительно запускается, но не работает полностью правильно. Я определил функцию, которая только взяла Print(*args), а затем просто вызвал print с sep='', end=''. И теперь это работает, как я хочу. Итак, один довод за идею.
Отзен

4

Многие из этих ответов кажутся немного сложными. В Python 3.x вы просто делаете это:

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

Значение по умолчанию end "\n". Мы просто меняем его на пробел, или вы также можете использовать end=""(без пробела) делать то, что printfобычно делает.


3

Вы хотите напечатать что-нибудь в for for right, но вы не хотите, чтобы это печаталось в новой строке каждый раз ... например:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

но вы хотите, чтобы это печаталось так: привет привет привет привет привет привет ???? просто добавьте запятую после печати "привет"

Пример:

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


5
Нет, ОП хочет хихихихихи, а не привет привет привет привет
Cool Javelin

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 (терминал Canopy и OSX соответственно) - не требуется импорт модуля или перемещение во времени.


8
Это печатает символы возврата на стандартный вывод. Может показаться правильным, если стандартный вывод является терминалом, но если он перенаправлен в файл, этот файл будет содержать управляющие символы.
Кит Томпсон

1
Правда, но я не могу себе представить, что кто-то хотел бы использовать это для чего-либо, кроме низкотехнологичного индикатора прогресса ...
многообещающий

1
Тем не менее, код Python не делает то же самое, что код C в вопросе.
Кит Томпсон

вы можете проверить, sys.stdout.isatty()если не перенаправлены в файл.
Fcm

0

Есть два основных способа сделать это:

Печать без перевода строки в Python 3.x

Ничего не добавляйте после оператора print и удаляйте '\ n', используя end='' как:

>>> 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),

Надеюсь, что это поможет вам. Вы можете посетить эту ссылку .


Как насчет пространства?
строптивая

используйте, end=" "например: print ('hello', end = '' "); print ('world')
susan097

Ваше решение 2.7 не удаляет пространство.
строптивая

Я упоминаю, что удаляем '\ n' не пробел, пробел по умолчанию в python2. Посмотрите, как это выглядит: print 'hello' ;print'there'в paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

Правильно, именно поэтому ваш ответ был отклонен. Вы не ответили на вопрос «Как печатать без перевода строки или пробела?». Ваш ответ для 2.x не отвечает на вопрос. Вы отвечаете за 3.0 так же, как и многие другие ответы, которые были опубликованы более девяти лет назад. Проще говоря, этот ответ не добавляет ничего полезного для сообщества, и вы должны удалить его.
строптивая

-3

... вам не нужно импортировать любую библиотеку. Просто используйте символ удаления:

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

это удаляет символ новой строки и пробел (^ _ ^) *

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.