meerdere prints op dezelfde regel in Python

Ik wil een script uitvoeren dat in feite een uitvoer als volgt laat zien:

Installing XXX...               [DONE]

Momenteel druk ik eerst Installing XXX...af en daarna druk ik [DONE]af.

Ik wil nu echter Installing XXX...en [DONE]op dezelfde regel afdrukken.

Enig idee?


Antwoord 1, autoriteit 100%

U kunt de instructie printgebruiken om dit te doen zonder syste importeren.

def install_xxx():
   print "Installing XXX...      ",
install_xxx()
print "[DONE]"

De komma aan het einde van de regel printvoorkomt dat printeen nieuwe regel geeft (houd er rekening mee dat er een extra spatie aan het einde van de uitvoer komt ).

De Python 3-oplossing
Aangezien het bovenstaande niet werkt in Python 3, kunt u dit in plaats daarvan doen (opnieuw, zonder syste importeren):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)
install_xxx()
print("[DONE]")

De afdrukfunctie accepteert een parameter enddie standaard is ingesteld op "\n". Door het in te stellen op een lege tekenreeks, wordt voorkomen dat er een nieuwe regel aan het einde van de regel wordt uitgegeven.


Antwoord 2, autoriteit 36%

Je kunt dit gewoon gebruiken:

print 'something',
...
print ' else',

en de uitvoer zal zijn

something else

het is niet nodig om te overdrijven door import sys. Let op het kommasymbool aan het einde.

Python 3+
print("some string", end="");om de nieuwe regel aan het einde te verwijderen. Lees meer door help(print);


Antwoord 3, autoriteit 20%

U moet backspace ‘\r‘ of (‘\x08‘) char gebruiken om terug te gaan naar de vorige positie in console-uitvoer

Python 2+:

import time
import sys
def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   
for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Python 3:

import time   
def backline():        
    print('\r', end='')                     # use '\r' to go back
for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

Deze code telt van 0% tot 100% op één regel. De uiteindelijke waarde is:

> python test.py
100%

Aanvullende informatie over Flush in dit geval hier: Waarom gedragen Python-afdrukverklaringen die ‘einde =’ argumenten in while-lussen anders gedragen?


4, Autoriteit 14%

Gebruik sys.stdout.write('Installing XXX... ')Installeren en sys.stdout.write('Done'). Op deze manier moet u de nieuwe regel met de hand toevoegen met "\n"als u de printfunctionaliteit wilt maken. Ik denk dat het misschien onnodig is om Curses alleen hiervoor te gebruiken.


5, Autoriteit 7%

meest eenvoudige:

Python 3

   print('\r' + 'something to be override', end='')

Het betekent dat het de cursor terugbrengt om te beginnen, dan zal iets afdrukken en eindigt in dezelfde lijn. Als het in een lus begint met afdrukken op dezelfde plaats, begint het.


6, Autoriteit 6%

Niets van de antwoorden werkte voor mij omdat ze allemaal zijn gepauzeerd totdat er een nieuwe lijn werd aangetroffen. Ik schreef een simpele helper:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

Test het:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

“Hallo” printt eerst naar het scherm voor de slaap. Daarna kunt u standaardafdruk gebruiken.


Antwoord 7, autoriteit 3%

Python voegt nieuwe regel toe als einde om af te drukken. Gebruik end=’ ‘ voor python3 voor de afdrukmethode om een spatie toe te voegen in plaats van een nieuwe regel. gebruik voor python2 een komma aan het einde van de printopdracht.

print('Foo', end=' ')
print('Bar')

Antwoord 8, autoriteit 3%

Dit eenvoudige voorbeeld drukt 1-10 op dezelfde regel af.

for i in range(1,11):
    print (i, end=" ")

Antwoord 9, autoriteit 3%

Print heeft een optioneel endargument, dit is wat uiteindelijk wordt afgedrukt.
De standaard is een nieuwe regel, maar u kunt deze wijzigen in een lege tekenreeks. bijv. print("hello world!", end="")


Antwoord 10

Als u de vorige regel wilt overschrijven (in plaats van er voortdurend aan toe te voegen), kunt u \rcombineren met print(),aan het einde van de afdruk uitspraak. Bijvoorbeeld,

from time import sleep
for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)
print("...DONE!")

telt van 0 tot 9, ter vervanging van het oude nummer in de console. De "...DONE!"wordt afgedrukt op dezelfde regel als de laatste teller, 9.

In jouw geval voor de OP, zou dit de console in staat stellen om het percentage voltooid van de installatie weer te geven als een “voortgangsbalk”, waar je een begin- en eindtekenpositie kunt definiëren en de markeringen ertussen kunt bijwerken.

>

print("Installing |XXXXXX              | 30%"),

Antwoord 11

Hier een 2.7-compatibele versie afgeleid van de 3.0-versie door @Vadim-Zin4uk:

Python 2

import time
for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush
    time.sleep(0.2)

Trouwens, de geleverde 3.0-oplossing ziet er een beetje opgeblazen uit. De backspace-methode maakt bijvoorbeeld geen gebruik van het integer-argument en kan waarschijnlijk helemaal worden afgeschaft.

Python 3

import time
for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush
    time.sleep(0.2)                         # sleep for 200ms

Beide zijn getest en werken.


Antwoord 12

print() heeft een ingebouwde parameter “end” die standaard is ingesteld op “\n”
Als u print (“Dit is Amerika”) roept, roept u eigenlijk print (“Dit is Amerika”, end = “\n”).
Een gemakkelijke manier om dit te doen, is door print(“This is America”, end =””)

. te bellen


Antwoord 13

Voor het geval je de waarden vooraf in een array hebt opgeslagen, kun je ze in het volgende formaat aanroepen:

for i in range(0,n):
       print arr[i],

Antwoord 14

Deze oplossing in Python 3.X specifiek:

Als ik dit moet doen, gebruik ik over het algemeen gewoon

end=' '

Bijvoorbeeld:

# end='' ends the output with a <space> 
print("Welcome to" , end = ' ') 
print("stackoverflow", end = ' ')

Dit wordt uitgevoerd als:

Welcome to stackoverflow

De spatie in end=kan worden vervangen door elk willekeurig teken. Bijvoorbeeld,

print("Welcome to" , end = '...') 
print("stackoverflow", end = '!')

Wat wordt uitgevoerd als:

Welcome to...stackoverflow!

Antwoord 15

Dit Quora gevonden post, met dit voorbeeld dat voor mij werkte (python 3),
wat het dichtst in de buurt kwam van waar ik het voor nodig had (d.w.z. de hele vorige regel wissen).

Het voorbeeld dat ze geven:

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

Voor het afdrukken op dezelfde regel, zoals anderen hebben gesuggereerd, gebruikt u gewoon end=""


Antwoord 16

Ik heb deze oplossing gevonden en het werkt op Python 2.7

# Working on Python 2.7 Linux
import time
import sys
def backspace(n):
    print('\r', end='')                     # use '\r' to go back
for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms

Other episodes