Python:在同一行上打印多个

时间:2011-04-08 16:38:59

标签: python printing

我想运行一个脚本,它基本上显示如下内容:

Installing XXX...               [DONE]

现在,在此功能成功后,我使用print打印整行。但是,我现在希望它首先打印“安装xxx ...”,并在功能运行之后添加“DONE”标签;但是在同一条线上。

有什么想法吗?

18 个答案:

答案 0 :(得分:250)

您可以使用print语句执行此操作,而无需导入sys

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

install_xxx()
print "[DONE]"

print行末尾的逗号会阻止print发出新行(您应该注意输出末尾会有一个额外的空格)。

Python 3解决方案
由于上述内容在Python 3中不起作用,您可以改为执行此操作(同样,不导入sys):

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

install_xxx()
print("[DONE]")

print函数接受end参数,默认为"\n"。将其设置为空字符串可防止它在该行的末尾发出新行。

答案 1 :(得分:100)

你可以简单地使用它:

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

,输出将是

something else

import sys无需过度杀伤。最后注意逗号符号。

Python 3 + print("some string", end="");在最后删除换行插入。阅读更多help(print);

答案 2 :(得分:43)

您应该使用退格键' \ r '或(' \ x08 ')字符串返回控制台输出中的上一个位置

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

此代码在一行上将从0%计算到100%。最终价值将是:

> python test.py
100%

此案例中有关同花顺的其他信息:Why do python print statements that contain 'end=' arguments behave differently in while-loops?

答案 3 :(得分:43)

使用sys.stdout.write('Installing XXX... ')sys.stdout.write('Done')。这样,如果要重新创建打印功能,则必须手动添加新行"\n"。我认为可能没有必要为此使用curses。

答案 4 :(得分:16)

没有一个答案对我有用,因为它们都会暂停,直到遇到新的一行。我写了一个简单的帮手:

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

测试它:

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

“你好”将首先打印出来并在睡眠前冲到屏幕上。之后,您可以使用标准打印。

答案 5 :(得分:14)

sys.stdout.write将打印而不返回

import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")

http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines

答案 6 :(得分:7)

这个简单的例子将在同一行打印1-10。

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

答案 7 :(得分:6)

Print有一个可选的结束参数,它是最后打印的。 默认值为换行符,但您可以将其更改为空字符串。例如:print(" hello world!",end ="")

答案 8 :(得分:6)

最简单:

Python 3

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

这意味着它将把光标返回到开始处,而不是打印一些内容并在同一行结束。如果处于循环中,它将在开始的位置开始打印。

答案 9 :(得分:4)

如果要覆盖上一行(而不是不断添加),可以在print语句的末尾将\rprint(),结合使用。例如,

from time import sleep

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

print("...DONE!")

将计数0到9,替换控制台中的旧数字。 "...DONE!"将打印在与最后一个计数器9相同的行上。

在OP的情况下,这将允许控制台显示安装完成百分比作为“进度条”,您可以在其中定义开始和结束字符位置,并更新两者之间的标记。

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

答案 10 :(得分:3)

这是一个2.7兼容的版本,源自@ Vadim-Zin4uk的3.0版本:

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)

就此而言,提供的3.0解决方案看起来有点臃肿。例如,退格方法没有使用整数参数,可能完全不用了。

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

两者都经过测试和工作。

答案 11 :(得分:2)

这是一个非常古老的主题,但这里有一个非常彻底的答案和示例代码。

\r是ASCII字符集中回车符的字符串表示形式。它与八进制015 [chr(0o15)]或十六进制0d [chr(0x0d)]或十进制13 [chr(13)]相同。有关无聊的阅读,请参阅man ascii。它(\r)是一个非常便携的表示,很容易让人阅读。它非常简单地意味着在不推进纸张的情况下将打印机上的托架一直移回到起点。它是CR的{​​{1}}部分,表示回车和换行

CRLF是Python 3中的一个函数。在Python 2(您有兴趣使用的任何版本)中,print()可以通过从{{{{}}导入其定义来强制进入函数。 1}}模块。 print功能的好处是,您可以指定最后打印的内容,覆盖__future__的默认行为,以便在每次print调用结束时打印换行符。

\n告诉Python刷新标准输出的输出,除非另外指定,否则使用print()发送输出。您还可以通过sys.stdout.flush运行或设置环境变量print()来获得相同的行为,从而跳过python -uPYTHONUNBUFFERED=1来电。如果您在应用程序正常运行之前忘记必须执行该步骤,那么通过这样做获得的数量几乎完全为零,并且调试起来不是很容易。

还有一个样本。请注意,这在Python 2或3中完美运行。

import sys

答案 12 :(得分:1)

此解决方案在 Python 3.X 中特定:

当我需要这样做时,我通常只会使用

end=' '

例如:

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

这输出为:

Welcome to stackoverflow

end= 中的空格可以替换为任意字符。例如,

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

输出为:

Welcome to...stackoverflow!

答案 13 :(得分:1)

如果您已将值预先存储在数组中,可以使用以下格式调用它们:

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

答案 14 :(得分:0)

print()具有内置参数“ end”,默认情况下设置为“ \ n” 调用print(“ This is America”)实际上是调用print(“ This is America”,end =“ \ n”)。 一种简单的方法是调用print(“ This is America”,end =“”)

答案 15 :(得分:0)

找到了这个Quora post,并使用了对我有用的示例(python 3), 这更接近了我的需要(即删除前一行)。

他们提供的示例:

import mysql.connector
db_connection = mysql.connector.connect(
host="141.45.91.40",
user="s0566293",
passwd="*******",
database="s0566293_projekt"
)
db_cursor = db_connection.cursor()
#Here creating database table as film'
#db_cursor.execute("CREATE TABLE Filme (filmName VARCHAR(255))") #already exists.

#Get database table'
db_cursor.execute("SHOW TABLES")
for table in db_cursor:
    print(table)
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import requests
import re

my_url = 'https://www.berlin.de/kino/_bin/azfilm.php'

# opening up connection , grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

#html parsing
page_soup = soup(page_html,"html.parser")

# grab any Zeichen 
az = page_soup.findAll("div",{"class":"block"})
fil = az[0]
sei = fil.findAll("li")


for s in sei:
    i=s.text
    if (i == '#'):
        continue
    else:
        seite = "https://www.berlin.de/kino/_bin/azfilm.php/de/{}".format(i)
        r = requests.get(seite)
        seiten_soup = soup(r.content, 'html.parser')
        #print page url
        #print("-------------------------------------------------------\n" + seite)
    #Filme jeder Seite

    # opening up connection , grabbing the page
        uClient = uReq(seite)
        page_html = uClient.read()
        uClient.close()

    #html parsing
        page_soup = soup(page_html,"html.parser")

    # grab any film
        az = page_soup.findAll("div",{"class":"inner"})
        fil = az[0]
        filme = fil.findAll("li")
        for film in filme:

                db_cursor.execute("INSERT INTO Filme(filmName) VALUES("+film.contents[0].contents[0]+")")
                db_cursor.execute("SHOW Filme")
                #print(film.contents[0].contents[0])

要像其他人建议的那样在同一行上打印,只需使用def clock(): while True: print(datetime.now().strftime("%H:%M:%S"), end="\r")

答案 16 :(得分:0)

Python附加换行符作为打印结束。将end =''用于python3打印方法,以添加空格而不是换行符。对于python2,请在打印语句的末尾使用逗号。

attr_accessor

答案 17 :(得分:-3)

我找到了这个解决方案,并且它正在使用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