python:如何在没有换行或空格的情况下print?

问题在题目里。

我想用python来做。在这个c语言的例子中,我想做的是:

1
2
3
4
5
6
7
#include <stdio.h>

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

输出:

1
..........

在Python中:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> for i in xrange(0,10): print '.'
.
.
.
.
.
.
.
.
.
.
>>> for i in xrange(0,10): print '.',
. . . . . . . . . .

在Python中print将添加一个
或一个空格,我如何避免?这只是一个例子。不要告诉我我可以先创建一个字符串,然后打印它。我想知道如何"附加"字符串到stdout


一般方式

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

你也可能需要打电话

1
sys.stdout.flush()

确保立即刷新stdout

Python 2.6 +

从python2.6中,你可以从python3中导入print函数:

1
from __future__ import print_function

这允许您使用下面的python3解决方案。

Python 3

在python3中,print语句已经变成了一个函数。在python3中,你可以这样做:

1
print('.', end='')

如果您使用了from __future__ import print_function,这在Python 2中也适用。

如果您在缓冲方面有问题,可以通过添加flush=True关键字参数刷新输出:

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

但是,请注意,Python 2中从__future__导入的print函数的版本中没有flush关键字;它只在python3中工作,更具体地说是3.3或更高版本。在较早的版本中,仍然需要通过调用sys.stdout.flush()手动刷新。

来源https://docs.python.org/2/library/functions.html#printhttps://docs.python.org/2/library/__future__.htmlhttps://docs.python.org/3/library/functions.html#print


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

回复:没有c/r怎么打印?

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

Is it possible to print something but not automatically have a
carriage return appended to it ?

是的,在要打印的最后一个参数后面添加逗号。例如,这个循环输出数字0..用空格隔开的一行。请注意添加最后换行的无参数"print":

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


注意:这个问题的标题曾经类似于"如何在python中打印f ?"

由于人们可能会根据标题来这里寻找它,Python还支持printf样式的替换:

1
2
3
4
5
6
7
8
>>> 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

而且,您可以方便地将字符串值相乘:

1
2
>>> print"." * 10
..........


为python2.6+使用python3风格的打印函数(也会破坏同一文件中任何现有的关键字打印语句)。

1
2
3
4
# 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文件

1
2
3
4
5
6
# printf.py

from __future__ import print_function

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

然后,在您的文件中使用它

1
2
3
4
5
from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

更多显示printf样式的示例

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


这不是题目中问题的答案,而是如何在同一行打印的答案:

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


新的(从Python 3.0开始)print函数有一个可选的end参数,允许修改结束字符。分隔符也有sep


使用functools。创建一个名为printf的新函数

1
2
3
4
5
6
7
>>> import functools

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

>>> printf("Hello world
"
)
Hello world

用默认参数包装函数的简单方法。


您可以在print函数的末尾添加,,这样它就不会在新行上打印了。


函数在python中自动生成一个新行。你可以试试:

print("Hello World", end="")


您可以使用printend参数来实现。在Python3中,range()返回iterator,而xrange()不存在。

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

Python 3.6.1的代码

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

输出

1
2
..........
>>>


在python3中,打印是一个函数。当你打电话

1
print ('hello world')

Python把它翻译成

1
2
print ('hello world', end = '
'
)

你可以把end改成任何你想要的。

1
2
print ('hello world', end = '')
print ('hello world', end = ' ')


你可以尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
import time
# Keeps the initial message in buffer.
sys.stdout.write("
foobar bar black sheep"
)
sys.stdout.flush()
# Wait 2 seconds
time.sleep(2)
# Replace the message with a new one.
sys.stdout.write("
"
+'hahahahaaa             ')
sys.stdout.flush()
# Finalize the new message by printing a return carriage.
sys.stdout.write('
'
)

我最近也有同样的问题。

我是这样解决的:

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys, os

# reopen stdout with"newline=None".
# in this mode,
# input:  accepts any newline character, outputs as '
'
# output: '

' 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


您可以在python3中执行同样的操作,如下所示:

1
2
3
4
5
6
#!usr/bin/python

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

并使用python filename.pypython3 filename.py执行它


python 2.6 +:

1
2
from __future__ import print_function # needs to be first statement in file
print('.', end='')

python 3:

1
print('.', end='')

python < = 2.5:

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

如果每次打印后额外的空间是可以的,在python2中

1
print '.',

在python2中误导-避免:

1
2
3
4
5
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') `

你会注意到上面所有的答案都是正确的。但我想做一个快捷方式,总是在末尾写入"end="参数。

你可以像这样定义一个函数

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

它将接受所有参数的数量。甚至它将接受所有其他参数,如文件,刷新等,并具有相同的名称。


@lenooh回答了我的问题。我在搜索"python禁止换行"时发现了这篇文章。我在Raspberry Pi上使用IDLE3来开发用于PuTTY的Python 3.2。我想在PuTTY命令行上创建一个进度条。我不想让页面滚动。我想要一条水平线来再次向用户保证,程序不会停止运行,也不会被发送到一个愉快的无限循环中去吃午饭——这是在请求"别打扰我,我很好,但这可能需要一些时间。"交互式消息——就像文本中的进度条。

print('Skimming for', search_string, '\b! .001', end='')通过准备下一个屏幕写来初始化消息,它将打印三个backspace作为??擦除,然后一个周期,擦去'001'并延长周期线。在search_string par用户输入之后,\b!将我的search_string文本的感叹号修改为返回到print()强制执行的空格上,正确地放置标点符号。然后是一个空格和我正在模拟的"进度条"的第一个"点"。不必要的是,消息还会被页码(格式为3,前导为0)所启动,以便从用户那里注意到正在处理的进度,这也将反映我们稍后将在右侧构建的周期数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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('
Sorting'
, 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'))行中。首先,要擦除左边的内容,它将光标备份到三个数字字符上,""作为??擦除并删除一个新周期,以增加进度条的长度。然后,它将它已经前进到的页面的三位数写入其中。因为sys.stdout.write()等待关闭一个完整的缓冲区或输出通道,所以sys.stdout.flush()强制立即写入。sys.stdout.flush()被构建到print()的末尾,后者被print(txt, end='' )绕过。然后,代码循环执行其普通的时间密集型操作,而不再打印任何内容,直到返回这里擦除三个数字,然后添加一个句点,然后再次编写三个数字,并递增。

这三个数字被擦除和重写是没有必要的——它只是一个繁荣的例子,sys.stdout.write()print()。你也可以很容易地用句号来启动,然后忘记三个花哨的反斜杠-b ?退格(当然,不写格式化的页面也要计算在内)通过每次只打印一个更长的句点栏—不使用空格或换行,只使用sys.stdout.write('.'); sys.stdout.flush()对。

请注意,树莓派IDLE3 Python shell不支持退格?而是打印一个空格,创建一个明显的分数列表。

- (o = 8 >奇才


您想要在for循环中正确地打印一些东西,但是您不希望每次都在新行中打印…例如:

1
2
3
4
5
6
7
8
9
 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


其中许多答案似乎有点复杂。Python 3。你只要这样做,

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

end的默认值是""。我们只是将它更改为空格,或者也可以使用end=""。


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

这对你很有用。这里逗号(,)在打印后很重要。获得帮助:http://freecodeszone.blogspot.in/2016/11/how to print-in-python-without-newline.html


或具有如下功能:

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

然后现在:

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

输出:

1
0123456789


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

这在2.7.8和amp中都适用。2.5.2(分别为Canopy和OSX terminal)——不需要模块导入或时间旅行。


这是一种不插入换行符的一般打印方法。

Python 3

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

在python3中,实现起来非常简单


一般有两种方法:

在Python 3.x中打印时不需要换行

打印语句后不添加任何内容,使用end='' as删除'':

1
2
3
4
5
6
7
8
9
10
11
>>> print('hello')
hello  # appending '
' automatically
>>> print('
world')
world # with previous '

' world comes down

# solution is:
>>> print('
hello', end='');print(' world'); # end with anything like end='-' or end="" but not '
'
hello world # it seem correct output

另一个循环中的例子:

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

在Python 2.x中打印时不需要换行

添加一个逗号表示在打印之后忽略

1
2
>>> print"hello",; print" world"
hello world

另一个循环中的例子:

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

希望这对你有帮助。你可以访问这个链接。


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

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

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