Jak drukować bez znaku nowej linii lub spacji?


1869

Chciałbym to zrobić . Co chciałbym zrobić w tym przykładzie w:

W C:

#include <stdio.h>

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

Wynik:

..........

W Pythonie:

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

W Python printdoda znak \nlub spację, jak mogę tego uniknąć? To tylko przykład, nie mów mi, że mogę najpierw zbudować ciąg, a następnie go wydrukować. Chciałbym wiedzieć, jak „dołączyć” ciągi znaków stdout.


8
Dla tych, którzy przeszukują dokumentację formatowania łańcucha Python: docs.python.org/library/stdtypes.html#string-formatting
guettli

1
Wygląda na to, że wcześniej zadano podobne pytanie: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Odpowiedzi:


2533

W Pythonie 3 możesz użyć parametrów sep=i funkcji:end=print

Aby nie dodawać nowego wiersza na końcu ciągu:

print('.', end='')

Aby nie dodawać spacji między wszystkimi argumentami funkcji, które chcesz wydrukować:

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

Możesz przekazać dowolny ciąg do dowolnego parametru i możesz użyć obu parametrów jednocześnie.

Jeśli masz problemy z buforowaniem, możesz opróżnić dane wyjściowe, dodając flush=Trueargument słowa kluczowego:

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

Python 2.6 i 2.7

Z Python 2.6 możesz albo zaimportować printfunkcję z Python 3, używając __future__modułu :

from __future__ import print_function

co pozwala na użycie powyższego rozwiązania Python 3.

Należy jednak pamiętać, że flushsłowo kluczowe nie jest dostępne w wersji printfunkcji importowanej z __future__Python 2; działa tylko w Pythonie 3, a dokładniej w wersji 3.3 i nowszych. We wcześniejszych wersjach nadal musisz ręcznie przepłukać połączenie z sys.stdout.flush(). Będziesz także musiał przepisać wszystkie inne instrukcje drukowania w pliku, w którym odbywa się ten import.

Lub możesz użyć sys.stdout.write()

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

Być może trzeba będzie zadzwonić

sys.stdout.flush()

aby zapewnić stdoutnatychmiastowe spłukanie.


2
Dzięki! W Pythonie 3.6.3 to flush = True ma kluczowe znaczenie, w przeciwnym razie nie działa zgodnie z przeznaczeniem.
gunit

3
Czy ktoś może wyjaśnić, dlaczego powinienem flushi co to właściwie robi?
Rishav

5
Jest kilka miesięcy spóźnienia, ale aby odpowiedzieć na @Rishav flush opróżnia bufor i wyświetla teraz wyjście. Bez koloru możesz ostatecznie wydrukować swój dokładny tekst, ale tylko wtedy, gdy system zacznie przetwarzać grafikę zamiast operacji we / wy. Opróżnianie sprawia, że ​​tekst jest natychmiast widoczny po „opróżnieniu” pamięci podręcznej.
Great Turtle

297

Powinno to być tak proste, jak opisano pod tym linkiem Guido Van Rossum:

Re: Jak można wydrukować bez AC / R?

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

Czy można coś wydrukować, ale nie jest do niego automatycznie dołączany znak powrotu karetki?

Tak, dodaj przecinek po ostatnim argumencie do wydrukowania. Na przykład ta pętla wypisuje liczby 0..9 w wierszu oddzielonym spacjami. Zwróć uwagę na bezparametrowy „print”, który dodaje ostatnią nową linię:

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

99
Jest to wyraźnie wymienione w pytaniu jako niepożądane zachowanie ze względu na spacje
Zags

87
Przeciwnie, odpowiedź należy usunąć z dwóch powodów: ma niepożądane skutki uboczne, których nie można wyłączyć (zawiera dodatkowe spacje), i nie jest kompatybilna z Pythonem 3 (nawias wymusza konwersję do krotki) . Oczekuję tego rodzaju tandetnych konstrukcji z PHP, a nie z Pythona. Dlatego najlepiej nigdy tego nie używać.
Eric Leschinski,

9
//, Jest to jednak najprostszy sposób na wykonanie tego w Pythonie 2, i istnieje DUŻO jednorazowego kodu dla naprawdę starych systemów operacyjnych. Prawdopodobnie nie najlepsze rozwiązanie, a nawet zalecane. Jednak jedną z wielkich zalet StackOverflow jest to, że informuje nas o dziwnych sztuczkach. KDP, czy umieściłbyś na górze szybkie ostrzeżenie o tym, co powiedział @Eric Leschinski? W końcu to ma sens.
Nathan Basanese

23
@nathanbasanese Proste czy nie, ma efekt uboczny, którego pytający wyraźnie nie chce . Doceniony.
Shadur,

8
270 głosujących za odpowiedzią, która konkretnie nie odpowiada na pytanie. Dobra robota upvoting ludzi. Dobra robota.
Cylindryczny

168

Uwaga: tytuł tego pytania brzmiał kiedyś jak „Jak wydrukować w Pythonie?”

Ponieważ ludzie mogą przychodzić tutaj, szukając go na podstawie tytułu, Python obsługuje również podstawianie w stylu 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

I możesz ręcznie pomnożyć wartości ciągów:

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

10
Rzeczywiście, nie ma sensu. :) Ponieważ była już świetna odpowiedź na pytanie, właśnie opracowałem kilka powiązanych technik, które mogą się okazać przydatne.
Beau

8
Opierając się na tytule pytania, uważam, że ta odpowiedź jest bardziej odpowiednia w porównaniu do tego, jak często używa się printf w C / C ++
Dan

16
Odpowiada to na tytuł pytania, ale nie na ciało. To powiedziawszy, zapewniło mi to, czego szukałem. :)
ayman,

2
to nie jest odpowiedź na pytanie
Vanuan,

4
@ Vanuan, wyjaśniłem na dole mojej odpowiedzi, że tytuł pytania zmienił się w pewnym momencie. :)
Beau,

93

Użyj funkcji drukowania w stylu python3 dla python2.6 + (spowoduje również uszkodzenie wszystkich istniejących instrukcji drukowania zawierających słowa kluczowe w tym samym pliku).

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

Aby nie zniszczyć wszystkich słów kluczowych do drukowania w Python2, utwórz osobny printf.pyplik

# printf.py

from __future__ import print_function

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

Następnie użyj go w swoim pliku

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

Więcej przykładów pokazujących styl printf

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

39

Jak drukować na tej samej linii:

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

27

Nowa (od Python 3.x) printfunkcja ma opcjonalny endparametr, który pozwala modyfikować znak końcowy:

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

Wynik:

CZEŚĆ CZEŚĆ

Istnieje również sepseparator:

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

Wynik:

WITAM WITAM WITAM

Jeśli chcesz użyć tego w Pythonie 2.x, po prostu dodaj to na początku pliku:

from __future__ import print_function


1
co robi „sep”?
McPeppr

1
@McPeppr Wiem, że jest stary, ale zredagowałem odpowiedź, aby uzyskać większą jasność. Sprawdź to teraz.
TheTechRobo36414519

Dzięki za edycję. sep przyda się. Do tej pory używałem sep.join (list) do łączenia elementów listy z separatorem pomiędzy nimi - idealny do pisania plików csv
McPeppr

21

Użycie funools.partial do utworzenia nowej funkcji o nazwie printf

>>> import functools

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

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

Łatwy sposób na zawinięcie funkcji o domyślne parametry.


16

Możesz po prostu dodać ,na końcu printfunkcji, aby nie drukowała w nowej linii.


1
//, To właściwie sprawiło, że nic nie wydrukowało. Czy nie musimy wtedy dodawać kolejnej instrukcji print bez argumentu na końcu, jak pokazano na stackoverflow.com/a/493500/2146138 ? Czy zechciałbyś zredagować tę odpowiedź za pomocą naprawdę krótkiego dwu- lub trzywierszowego przykładu?
Nathan Basanese

3
OP nie chce
dodawać

2
Nie odpowiedziałem na pytanie. Bez odstępów.
shrewmouse

To już nie działa w Pythonie 2.x i odpowiada tylko na połowę tego, czego chciał OP. Dlaczego 16 głosów pozytywnych?
TheTechRobo36414519

12

W Python 3+ printjest funkcją. Kiedy zadzwonisz

print('hello world')

Python tłumaczy to na

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

Możesz zmienić endna co tylko chcesz.

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='')

python 3 :

print('.', end='')

python <= 2.5 :

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

jeśli dodatkowe miejsce jest OK po każdym wydruku, w Pythonie 2

print '.',

wprowadzające w błąd w python 2 - unikaj :

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

Możesz spróbować:

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

Możesz zrobić to samo w python3 w następujący sposób:

#!usr/bin/python

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

i wykonaj to za pomocą python filename.pylubpython3 filename.py


5

ostatnio miałem ten sam problem ..

rozwiązałem to przez:

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)

działa to zarówno na Uniksie, jak i na Windowsie ... nie testowałem tego na Macosxie ...

hth


2
Przerwysys.__stdout__
pppery

4

@lenooh spełnił moje zapytanie. Odkryłem ten artykuł, szukając hasła „python suppress newline”. Używam IDLE3 na Raspberry Pi do programowania Python 3.2 dla PuTTY. Chciałem utworzyć pasek postępu w linii poleceń PuTTY. Nie chciałem przewijać strony. Chciałem, aby linia pozioma ponownie zapewniła użytkownika, że ​​nie wystraszy się, że program nie przestał się zatrzymywać ani nie został wysłany na lunch w wesołej, nieskończonej pętli - w ramach prośby „zostaw mnie, jestem w porządku, ale może to zająć trochę czasu. wiadomość interaktywna - jak pasek postępu w tekście.

print('Skimming for', search_string, '\b! .001', end='')Inicjuje wiadomość poprzez przygotowanie do następnego ekranu i zapisu, który będzie drukować trzy backspace jak ⌫⌫⌫ rubout a potem okres, ścierając „001” i wydłużenie linii okresach. Po search_stringwprowadzeniu danych przez papugi, \b!przycina wykrzyknik mojego search_stringtekstu, aby cofnął się o przestrzeń, która w print()przeciwnym razie wymusza, odpowiednio umieszczając interpunkcję. Następnie następuje spacja i pierwsza „kropka” „paska postępu”, którą symuluję. Niepotrzebnie wiadomość jest następnie wypełniana również numerem strony (sformatowanym do długości trzech z wiodącymi zerami), aby zwrócić uwagę użytkownika na przetwarzanie danych, a także odzwierciedlić liczbę okresów, które później zbudujemy do dobrze.

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

Mięso paska postępu znajduje się w sys.stdout.write('\b\b\b.'+format(page, '03'))linii. Po pierwsze, aby skasować w lewo, tworzy kopię zapasową kursora nad trzema znakami numerycznymi za pomocą „\ b \ b \ b” jako „⌫⌫⌫” i upuszcza nowy okres, aby zwiększyć długość paska postępu. Następnie zapisuje trzy cyfry strony, do której doszedł do tej pory. Ponieważ sys.stdout.write()czeka na zamknięcie pełnego bufora lub kanału wyjściowego, sys.stdout.flush()wymusza natychmiastowy zapis. sys.stdout.flush()jest wbudowany, na końcu print()którego jest omijanyprint(txt, end='' ) . Następnie kod przechodzi przez swoje przyziemne operacje wymagające dużego nakładu czasu, podczas gdy nie drukuje nic więcej, dopóki nie powróci tutaj, aby usunąć trzy cyfry, dodać kropkę i ponownie napisać trzy cyfry, przyrostowo.

Trzy cyfry, wyczyszczone i przepisane, nie są w żadnym wypadku konieczne - to tylko zawijas, który stanowi przykład w sys.stdout.write()porównaniu do print(). Możesz równie łatwo zalać kropką i zapomnieć o trzech fantazyjnych odwrotnych ukośnikach-b ⌫ (oczywiście nie zapisując również sformatowanej liczby stron), po prostu drukując pasek kropki dłużej o jeden za każdym razem - bez spacji i znaków nowej linii, używając tylkosys.stdout.write('.'); sys.stdout.flush() para.

Należy pamiętać, że powłoka Python Raspberry Pi IDLE3 nie honoruje backspace jako ⌫ wymazywania, ale zamiast tego drukuje spację, tworząc zamiast tego widoczną listę ułamków.

- (o = 8> wiz


4

Zauważysz, że wszystkie powyższe odpowiedzi są prawidłowe. Ale chciałem zrobić skrót, aby zawsze pisać na końcu parametr „end = ''”.

Możesz zdefiniować funkcję podobną do

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

Akceptuje całą liczbę parametrów. Nawet zaakceptuje wszystkie inne parametry, takie jak file, flush itp. O tej samej nazwie.


Nie działa, narzeka *argna początek (python 2.7), a umieszczenie go na końcu działało, ale nie działało całkowicie poprawnie. Zdefiniowałem funkcję, która tylko wzięła Print(*args), a następnie po prostu wywołałem print za pomocą sep='', end=''. A teraz działa tak, jak chcę. Jeden głos za tym pomysłem.
Otzen

4

Wiele z tych odpowiedzi wydaje się nieco skomplikowanych. W Python 3.x po prostu to robisz:

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

Domyślna wartość końca to "\n". Po prostu zmieniamy go na spację lub możesz też użyć end=""(bez spacji), aby zrobić to, co printfzwykle.


3

chcesz wydrukować coś w pętli w prawo, ale nie chcesz, aby drukowała się w nowej linii za każdym razem ... na przykład:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

ale chcesz, aby drukował w ten sposób: cześć cześć cześć cześć dobrze ???? po prostu dodaj przecinek po wydrukowaniu „cześć”

Przykład:

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


5
Nie, OP chce hihihihihi, nie cześć cześć cześć cześć
Cool Javelin

1

Lub mieć funkcję taką jak:

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

Więc teraz:

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

Wyjścia:

0123456789

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

Działa to zarówno w wersjach 2.7.8, jak i 2.5.2 (odpowiednio Canopy i OSX) - nie wymaga importu modułu ani podróży w czasie.


8
To drukuje znaki backspace na standardowym wyjściu. Może wyglądać poprawnie, jeśli standardowe wyjście jest przypadkiem terminalem, ale jeśli zostanie przekierowane do pliku, plik ten będzie zawierał znaki sterujące.
Keith Thompson

1
To prawda, ale nie mogę sobie wyobrazić, że ktokolwiek chciałby użyć tego do czegoś innego niż pasek postępu low-tech ...
tyersome

1
Niemniej jednak kod Python nie robi tego samego co kod C w pytaniu.
Keith Thompson,

możesz przetestować, sys.stdout.isatty()jeśli nie zostaniesz przekierowany do pliku.
fcm

0

Istnieją dwa ogólne sposoby na to:

Drukuj bez nowej linii w Pythonie 3.x

Nie dodawaj nic po instrukcji print i usuń „\ n”, używając end='' jako:

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

Kolejny przykład w pętli :

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

Drukuj bez nowej linii w Python 2.x

Dodanie przecinka końcowego oznacza, że ​​po wydruku ignoruj \n.

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

Kolejny przykład w pętli :

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

Mam nadzieję, że to ci pomoże. Możesz odwiedzić ten link .


Co z przestrzenią?
shrewmouse

użyj end=" "np .: print ('hello', end = '' "); print ('world')
susan097

Twoje rozwiązanie 2.7 nie usuwa przestrzeni.
shrewmouse

Wspominam, że usuń „\ n” nie spację, spacja jest domyślnie w python2. Zobacz, jak to wygląda: print 'hello' ;print'there'w paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

Właśnie dlatego twoja odpowiedź została odrzucona. Nie odpowiedziałeś na pytanie „Jak drukować bez znaku nowej linii lub spacji?”. Twoja odpowiedź na 2.x nie odpowiada na pytanie. Odpowiedź na 3.0 jest taka sama, jak wiele innych odpowiedzi, które zostały opublikowane ponad dziewięć lat temu. Mówiąc wprost, ta odpowiedź nie dodaje nic użytecznego dla społeczności i należy ją usunąć.
shrewmouse

-3

... nie musisz importować żadnej biblioteki. Wystarczy użyć znaku usuwania:

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

to usuwa znak nowej linii i spację (^ _ ^) *

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.