如何在没有换行符或空格的情况下进行打印?


1867

我想在里面做 。我想在这个例子中做什么

在C中:

#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 2011年

1

Answers:


2530

在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使用__future__模块从Python 3 导入函数:

from __future__ import print_function

允许您使用上面的Python 3解决方案。

但是,请注意,在从Python 2中导入flushprint函数的版本中,关键字不可用__future__;它仅适用于Python 3,更具体地说是3.3及更高版本。在早期版本中,您仍然需要通过调用进行手动刷新sys.stdout.flush()。您还必须在执行此导入操作的文件中重写所有其他打印语句。

或者你可以使用 sys.stdout.write()

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

您可能还需要致电

sys.stdout.flush()

确保stdout立即冲洗。


2
谢谢!在Python 3.6.3中,flush = True是至关重要的,否则它将无法正常工作。
gunit

3
有人可以解释为什么我需要flush它,它实际上是做什么的吗?
里沙夫

5
现在已经晚了几个月,但是要回答@Rishav flush,会清空缓冲区并立即显示输出。如果没有刷新,则最终可能会打印出准确的文本,但是只有在系统开始处理图形而不是IO时才可以打印。刷新通过“刷新”缓存使文本立即可见。
大乌龟

297

它应该像Guido Van Rossum在此链接中描述的那样简单:

回复:没有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
由于存在空格,此问题在问题中特别列为不良行为
Zags 2015年

86
相反,应出于以下两个原因删除答案:它具有您无法禁用的不良副作用(包括多余的空格),并且与python 3不向前兼容(括号强制转换为元组) 。我希望这些来自PHP而不是Python的伪劣构造。因此,最好永远不要使用此功能。
Eric Leschinski 2015年

9
//,但这是在Python 2中完成此操作的最简单方法,而且对于真正的旧OS,这里有很多一次性代码。可能不是最好的解决方案,甚至没有推荐。但是,StackOverflow的一大优点是它可以让我们知道那里有什么怪异的把戏。KDP,您会在顶部包含有关@Eric Leschinski所说的内容的快速警告吗?毕竟,这确实是有道理的。
弥敦道(Nathan Basanese),2015年

23
@nathanbasanese不管是否简单,它都具有asker 明确不希望的副作用。不赞成投票。
沙杜尔2015年

8
270赞成一个答案,该答案专门不能解决问题。努力工作的人。辛苦了
Cylindric

168

注意:这个问题的标题曾经是“如何在python中使用printf?”之类的东西。

由于人们可能会来这里根据标题进行查找,因此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
确实,它没有讲到重点。:)既然已经很好地回答了这个问题,那么我只是在阐述一些可能有用的相关技术。
Beau

8
基于问题的标题,我相信这个答案更像是一种在C / C ++中通常使用printf的方式
丹,2009年

16
这回答了问题的标题,但没有回答正文。就是说,它为我提供了我想要的东西。:)
艾曼,

2
这不是问题的答案
Vanuan 2012年

4
@Vanuan,我在回答的底部解释了问题的标题在某些时候已更改。:)

93

对python2.6 +使用python3样式的打印功能 (还将破坏同一文件中任何现有的关键字打印语句。)

# 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

新功能(自Python 3.x起)print具有一个可选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

感谢您的修改。9月将派上用场。到目前为止,我使用sep.join(list)将列表中的元素与之间的分隔符连接起来-非常适合编写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所示?您愿意以简短的两三行示例来编辑此答案吗?
弥敦道(Nathan Basanese),2015年

3
行动党

2
没有回答这个问题。空间不足。
shrewmouse18年

这在Python 2.x中不再起作用,只能解决OP想要的一半。为什么要进行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='')

的Python 3

print('.', end='')

python <= 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上对其进行测试...

hth


2
休息时间sys.__stdout__
pppery

4

@lenooh满足了我的查询。我在搜索“ python抑制换行符”时发现了这篇文章。我在Raspberry Pi上使用IDLE3开发用于PuTTY的Python 3.2。我想在PuTTY命令行上创建一个进度条。我不希望页面滚动离开。我想要一条水平线来再次确保用户不会害怕该程序没有停顿下来,也没有在快乐的无限循环中被送去吃午饭-恳求“离开我,我做得很好,但这可能需要一些时间。” 交互式消息-类似于文本中的进度条。

print('Skimming for', search_string, '\b! .001', end='')初始化通过准备下一屏幕写,这将打印3退格作为⌫⌫⌫调刀混合法,然后一个周期,拭去“001”和延伸期间的行中的消息。之后search_string鹦鹉用户输入,\b!修剪我的惊叹号search_string文字背在其上的空间print(),否则的力量,正确放置标点符号。接下来是空格和我正在模拟的“进度条”的第一个“点”。然后,该消息也不必要地以页码填充(格式为长度为3的长度,前导零),以引起用户的注意,正在处理进度,这也将反映出我们稍后将构建的周期数对。

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()。您只需将周期条每次打印更长的时间,就可以很容易地给句号加注,而忘记三个花哨的反斜杠-b⌫退格键(当然也不会写入格式化的页数),而无需使用空格或换行符,而只需使用sys.stdout.write('.'); sys.stdout.flush()对。

请注意,Raspberry Pi IDLE3 Python外壳程序不将Backspace用作⌫rubout,而是打印一个空格,而是创建一个明显的分数列表。

-(o = 8> wiz


4

您会注意到上述所有答案都是正确的。但是我想做一个捷径,总是总是在最后写入“ end =”参数。

你可以定义一个像

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

它将接受所有数量的参数。即使它将接受所有其他参数,如file,flush等,并使用相同的名称。


它没有运行,它抱怨它*arg在开始(python 2.7),并把它放到末尾确实可以运行,但是不能完全正确地工作。我定义了一个只接受的函数,Print(*args)然后使用调用了print sep='', end=''。现在它可以按我的意愿工作了。因此,一个人对此表示赞同。
奥岑(Otzen)

4

这些答案中的许多似乎有些复杂。在Python 3.x中,您只需执行以下操作:

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

end的默认值是"\n"。我们只是将其更改为空格,或者您也可以使用end=""(没有空格)执行printf通常的操作。


3

您想在for循环中打印一些内容;但是您不希望它每次都在新行中打印..例如:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

但是您希望它像这样打印:嗨,嗨,嗨,嗨,嗨?只需在打印“ hi”后添加一个逗号

例:

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


5
不,OP希望hihihihihi,而不是hi hihi hi hi
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
没错,但是我无法想象除了低技术含量的进度条之外,没有人会想使用它……
令人讨厌的2015年

1
但是,Python代码与问题中的C代码没有相同的作用。
基思·汤普森

您可以测试sys.stdout.isatty()是否未重定向到文件。
fcm

0

一般有两种方法可以做到这一点:

在Python 3.x中不使用换行符进行打印

在print语句之后不添加任何内容,并使用end='' as 删除'\ n' :

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

希望这会帮助你。您可以访问此链接


那空间呢?
shrewmouse

使用end=" "例如:print('hello',end =“''”); print('world')
susan097

您的2.7解决方案不会删除空间。
shrewmouse

我提到删除'\ n'不是空格,在python2中默认是空格。看看外观如何:print 'hello' ;print'there'paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQ
susan097

是的,这就是为什么您的答案被否决的原因。您没有回答“如何在没有换行符或空格的情况下进行打印?”的问题。您对2.x的回答没有回答问题。您的3.0答案与9年前发布的许多其他答案相同。简而言之,此答案对社区没有任何帮助,您应该将其删除。
shrewmouse

-3

...您不需要导入任何库。只需使用删除字符:

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

这将删除换行符和空格(^ _ ^)*

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.