Python'da aynı hatta birden çok baskı


229

Temelde böyle bir çıktı gösteren bir komut dosyası çalıştırmak istiyorum:

Installing XXX...               [DONE]

Şu anda önce yazdırıyorum Installing XXX...sonra da yazdırıyorum [DONE].

Ancak, şimdi yazdırmak istediğiniz Installing xxx...ve [DONE]aynı satırda.

Herhangi bir fikir?



1
Bu sorunun yanıtları bazen çizgiyi temizlemek istediğinizden bahsetmez, bkz: stackoverflow.com/questions/45263205
ideasman42

Yanıtlar:


284

printİfadeyi içe aktarmadan yapmak için kullanabilirsiniz sys.

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

printSatırın sonundaki virgül printyeni bir satır yayınlamayı önler (çıktının sonunda fazladan bir boşluk olacağını unutmayın).

Python 3 Çözümü
Yukarıdakiler Python 3'te çalışmadığından, bunu (yine içe aktarmadan sys) yapabilirsiniz:

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

install_xxx()
print("[DONE]")

Yazdırma işlevi, endvarsayılan değeri olan bir parametreyi kabul eder "\n". Boş bir dizeye ayarlamak, satırın sonunda yeni bir satır yayınlamasını engeller.


1
Mükemmel çalışıyor. Şimdiye kadar sadece stdout çözümleri görmüştü. Bunu bilmek gerçekten güzel.
Prometheus

5
Hem baskılarınız hem de arada zaman harcayan bir işleminiz varsa (hepsi aynı işlev / girinti düzeyinde) bu işe yaramaz. Eylem başlamadan önce hiçbir çıktı yoktur ve bittikten sonra çıktı bir bütün olarak görünür
Paddre

2
Bu muhtemelen daha çok işletim sistemi tarafından bir bütün olarak işlem için önceden oluşturulmuş çıktı tamponlamanın bir fonksiyonudur, ki bu pitona özgü bir problem değildir. Python'a özgü bir geçici çözüm için stackoverflow.com/questions/107705 adresine bakın .
multipleinterfaces

13
Bir yeni satır olmadan, muhtemelen arabelleği açıkça temizlemek istersiniz. print("...", end="", flush=True)Python 3'te kullanın , Python 2'de bir sys.stdout.flush()çağrı ekleyin .
Martijn Pieters

7
python 3.x sonuna sonuna ekli basılı hat VS değiştirmek için sona bir "\ r" eklemek isteyeceksinizprint("Progress: {}%".format(var), end="\r", flush=True)
John

103

Bunu sadece kullanabilirsiniz:

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

ve çıktı

something else

aşırıya kaçmaya gerek yok import sys. Sonunda virgül sembolüne dikkat edin.

Python 3+ print("some string", end=""); sonunda satırsonu ekini kaldırmak için. Daha fazla okuhelp(print);


3
Bu yöntemi kullanarak iki boşluk olduğunu unutmayın
ethanjyx

1
Bu en basit ve en etkili cevaptır.
gixxer

Yazdırma argümanları parantez içinde olduğunda bu çalışmaz. Bu işe yarar: <baskı "merhaba" ,; print ("merhaba")> ancak bu işe yaramaz <print ("merhaba",); print ("merhaba")>
Mayank Jaiswal

@MayankJaiswal Bu, ebeveynlerle birlikte çalışır. print ('merhaba'),
drglove

1
printişlevi python 2 VS 3'te biraz farklı sözdizimine sahiptir.
boldnik

52

Konsol çıktısında önceki konuma geri dönmek için ' \ r ' veya (' \ x08 ') karakterini kullanmalısınız

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

Bu kod bir satırda% 0 ile% 100 arasında sayılır. Nihai değer:

> python test.py
100%

Bu durumda floş hakkında ek bilgi: 'end =' bağımsız değişkenlerini içeren python print deyimleri neden-döngülerde farklı davranıyor?


1
Açıklığa kavuşturmak için, bu örnekteki yorum kodu Python 2 için ve yorumlanmamış satırlar Python 3 içindir.
Kaplumbağalar Sevimli

1
Bouth hatları Python 3'te iyi çalışır. '\ x08' öğesini geri boşluk olarak kullanırsanız, çıkış akışını temizlemeniz gerekir - print ((b '\ x08' * n) .decode (), end = '', flush = Doğru)
Vadim Zin4uk

1
Satır başı '\ r' satırın başına gider, bu yüzden '* n' gereksizdir
bjnortier

43

Kullanım sys.stdout.write('Installing XXX... ')ve sys.stdout.write('Done'). Bu şekilde, "\n"yazdırma işlevini yeniden oluşturmak istiyorsanız yeni satırı elle eklemeniz gerekir . Sadece bunun için lanet kullanmanın gereksiz olabileceğini düşünüyorum.


4
Ben şahsen bu çözümü daha yüksek oylu olana tercih ederim çünkü __future__ithalata ya da buna benzer bir şeye ihtiyaç duymadan python2.x ve python3.x üzerinde aynı şekilde çalışır .
mgilson

17

Cevapların hiçbiri benim için işe yaramadı çünkü hepsi yeni bir çizgiyle karşılaşana kadar durakladı. Basit bir yardımcı yazdım:

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

Test etmek için:

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

"merhaba" önce yazdıracak ve uykudan önce ekrana akacaktır. Bundan sonra standart baskıyı kullanabilirsiniz.


1
Teşekkür ederim! Tam olarak ihtiyacım olan şey aka .flush ()
MrNice


11

En basit:

Python 3

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

Bu, imleci başlangıca geri döndüreceği, bir şey yazdıracağı ve aynı satırda sona ereceği anlamına gelir. Bir döngüde ise, yazdırdığı yerde yazdırmaya başlayacaktır.


3
Güzel! Windows'da da çalışır.
Shital Shah

2
Teşekkürler bu benim için iyi çalışıyor! Bence bu print(’something to be override’, end=‘\r’)daha basit.
Tropilio

9

Bu basit örnek aynı satıra 1-10 yazdıracaktır.

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

9

Yazdırmanın isteğe bağlı bir endargümanı vardır, sonunda yazdırılan şey budur. Varsayılan, yeni satırdır, ancak boş dize olarak değiştirebilirsiniz. Örneğinprint("hello world!", end="")


2
Bu python 3'te. Python 2'de basitçe yapabilirsiniz print 'something',. Sondaki virgül, yeni satırın eklenmesini önler.
arjoonn

4

Önceki satırın üzerine yazmak istiyorsanız (sürekli olarak eklemek yerine), print ifadesinin sonunda \rile birleştirebilirsiniz print(),. Örneğin,

from time import sleep

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

print("...DONE!")

konsoldaki eski sayının yerine 0 ile 9 sayılacaktır. "...DONE!"Geçen sayaç, 9 ile aynı satırda yazdırılır.

Bu OP için durumunuzda, konsolun yüklemenin tamamlanma yüzdesini bir "ilerleme çubuğu" olarak görüntülemesine izin verir, burada bir başlangıç ​​ve bitiş karakter konumu tanımlayabilir ve aradaki işaretleri güncelleyebilirsiniz.

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

4

@ Vadim-Zin4uk 3.0 versiyonundan türetilmiş 2.7 uyumlu bir versiyon:

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)

Bu nedenle, sağlanan 3.0 çözümü biraz şişmiş görünüyor. Örneğin, geri silme yöntemi tamsayı bağımsız değişkenini kullanmaz ve büyük olasılıkla tamamen ortadan kaldırılabilir.

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

Her ikisi de test edildi ve çalıştı.


2

Bu çok eski bir iş parçacığı, ama işte çok kapsamlı bir cevap ve örnek kod.

\rASCII karakter kümesinden Satır Başı dize temsilidir . Sekizli 015[ chr(0o15)] veya onaltılık 0d[ chr(0x0d)] veya ondalık 13[ chr(13)] ile aynıdır . man asciiSıkıcı bir okuma için bakın . O ( \r) oldukça portatif temsilidir ve insanlar için kolay okunur yeterlidir. Çok basit bir şekilde, daktilodaki taşıyıcının kağıdı ilerletmeden başlangıcına kadar geri getirmesi anlamına gelir. Bu bir CRparçasıCRLF Satır Başı ve Satır Besleme anlamına .

print()Python 3'te (Python 2'de (kullanmak istediğiniz herhangi bir sürüm), printtanımını __future__modülden içe aktararak bir işleve zorlanabilir . Bu printişlevin yararı , sonunda ne yazdıracağınızı belirleyebilmenizdir \nve her print()çağrının sonunda bir yeni satır yazdırmanın varsayılan davranışını geçersiz kılar .

sys.stdout.flushPython'a, aksi belirtilmedikçe çıktı gönderdiğiniz standart çıktı çıktısını temizlemesini söyler print(). Aynı davranışı, python -uortam değişkeni ile çalışarak veya ayarlayarak PYTHONUNBUFFERED=1, böylece import sysve sys.stdout.flush()çağrılarını atlayarak da alabilirsiniz . Bunu yaparak elde ettiğiniz miktar neredeyse sıfırdır ve uygulamanızın düzgün davranmadan önce bu adımı yapmanız gerektiğini unutursanız hata ayıklamak çok kolay değildir.

Ve bir örnek. Bunun Python 2 veya 3'te mükemmel çalıştığını unutmayın.

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()

Cevabınızın daha uygun olduğunu düşünüyorum: stackoverflow.com/questions/45263205/…
Marc Cayuela Rafols

2

print (), varsayılan olarak "\ n" olarak ayarlanmış yerleşik bir "end" parametresine sahiptir. print ("This America") çağırıyor aslında print ("This America", end = "\ n") çağırıyor. Bunu yapmanın kolay bir yolu print'i aramaktır ("Burası Amerika", end = "")


1

Değerleri bir dizide önceden saklamış olmanız durumunda, bunları aşağıdaki biçimde çağırabilirsiniz:

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

1

Python, yeni satırı yazdırmanın sonu olarak ekler. Yeni satır yerine boşluk eklemek için yazdırma yöntemi için python3 için end = '' kullanın. python2 için print deyiminin sonunda virgül kullanın.

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

0

Bu Quora yayınını buldumBenim için işe yarayan bu örnekle (Python 3) buldum, bu da ihtiyacım olan şeye daha yakındı (yani önceki satırın tamamını silerek).

Sağladıkları örnek:

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

Diğerlerinin önerdiği gibi, aynı satıra yazdırmak için end=""


-2

Bu çözümü buldum ve Python 2.7 üzerinde çalışıyor

# 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

1
Bu printPython 2.7 için yanlış sözdizimi ve kod doğru sözdizimi ile bile çalışmaz.
Cory Madden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.