Как печатать без перевода строки или пробела? - PullRequest
1649 голосов
/ 29 января 2009

Вопрос в заголовке.

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

#include <stdio.h>

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

Выход:

..........

В Python:

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

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

Ответы [ 21 ]

6 голосов
/ 22 июля 2015

питон 2,6 + :

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

питон 3 :

print('.', end='')

питон <= <strong>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') `
6 голосов
/ 18 июня 2012

у меня недавно была такая же проблема ..

Я решил это, выполнив:

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 ...

НТН

5 голосов
/ 09 марта 2017

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

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

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

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

5 голосов
/ 05 июля 2013

Вы можете сделать то же самое в python3 следующим образом:

#!usr/bin/python

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

и выполните его с python filename.py или python3 filename.py

4 голосов
/ 24 ноября 2015

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

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

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

4 голосов
/ 23 июля 2015

вы хотите напечатать что-то в цикле 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

4 голосов
/ 28 февраля 2015

@ 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 не обрабатывает символ возврата на обратную сторону как символ out, но вместо этого печатает пробел, создавая вместо этого видимый список дробей.

- (o = 8> wiz

2 голосов
/ 17 октября 2018

Или иметь такую ​​функцию, как:

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

Тогда сейчас:

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

Выходы:

0123456789
2 голосов
/ 19 октября 2014
for i in xrange(0,10): print '\b.',

Это работало как в 2.7.8, так и в 2.5.2 (терминал Canopy и OSX соответственно) - не требуется импорт модуля или перемещение во времени.

0 голосов
/ 20 августа 2018

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

Печать без перевода строки в 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),

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

...