Як друкувати без нової лінії чи пробілу?


1870

Я хотів би зробити це в . Що я хотів би зробити в цьому прикладі в:

В:

#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
Vignesh Bayari R.

Відповіді:


2533

У 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 цей флеш = True має вирішальне значення, інакше він не працює за призначенням.
gunit

3
Чи може хтось пояснити, навіщо мені це потрібно flushі що він робить насправді?
Рішав

5
На кілька місяців пізніше, але щоб відповісти @Rishav, флеш спорожняє буфер і відображає вихід прямо зараз. Без залишків, можливо, ваш точний текст буде надрукований з часом, але лише тоді, коли система обходиться обробкою графіки замість IO. 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 Простий чи ні, він має побічний ефект, який запитувач явно не хоче . Захищений.
Шадур

8
270 заявок на відповідь, яка конкретно не відповідає на питання. Гарна робота, що сприяє людям. Гарна робота.
Циліндрик

168

Примітка. Заголовок цього питання раніше виглядав на кшталт "Як printf у 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 ++
Dan

16
Це відповідає заголовку питання, але не тілу. Це сказало, що це дало мені те, що я шукав. :)
айман

2
це не відповідь на питання
Вануан

4
@ Вануан, я пояснив у нижній частині своєї відповіді, що назва питання змінилася в якийсь момент. :)
Beau

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
що робить "sep"?
McPeppr

1
@McPeppr Я знаю, що це старе, але я все-таки відредагував відповідь для більшої наочності. Перевірте це зараз.
TheTechRobo36414519

Дякуємо за редагування sep стане в нагоді. Поки я використовував sep.join (список) для об'єднання елементів списку з роздільником між ними - ідеально підходить для запису файлів 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 і відповідає лише половині того, чого хотів ОП. Чому 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" як "перемикання" і додає новий період, щоб додати до довжини смужки ходу. Потім він записує три цифри сторінки, на якій прогресував дотепер. Оскільки 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()пари.

Зауважте, що оболонка Raspberry Pi IDLE3 Python не враховує зворотний простір як «перемикання», а натомість друкує пробіл, створюючи натомість список очевидних фракцій.

- (o = 8> wiz


4

Ви помітите, що всі вищевказані відповіді правильні. Але я хотів зробити ярлик, щоб завжди в кінці записувати параметр "end =" ".

Ви можете визначити функцію типу

def Print(*args,sep='',end='',file=None,flush=False):
    print(*args,sep=sep,end=end,file=file,flush=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 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
Ні, ОП хоче hihihihihi, а не привіт, привіт, привіт, привіт
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
Щоправда, але я не можу уявити, що хтось хотів би використати це для чогось іншого, крім низькотехнологічної смуги прогресу ...
tyersome

1
Тим не менш, код Python не робить те саме, що код C у питанні.
Кіт Томпсон

ви можете перевірити, sys.stdout.isatty()чи не переспрямований у файл.
fcm

0

Для цього є два способи:

Друк без нового рядка в Python 3.x

Не додайте нічого після заяви про друк та видаліть "\ 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 ('привіт', 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.