Làm thế nào để in mà không có dòng mới hoặc không gian?


1872

Tôi muốn làm điều đó trong . Những gì tôi muốn làm trong ví dụ này trong:

Trong C:

#include <stdio.h>

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

Đầu ra:

..........

Trong Python:

>>> for i in range(10): print('.')
.
.
.
.
.
.
.
.
.
.
>>> print('.', '.', '.', '.', '.', '.', '.', '.', '.', '.')
. . . . . . . . . .

Trong Python printsẽ thêm một \nhoặc khoảng trắng, làm thế nào tôi có thể tránh điều đó? Bây giờ, nó chỉ là một ví dụ, đừng nói với tôi rằng trước tiên tôi có thể xây dựng một chuỗi sau đó in nó. Tôi muốn biết làm thế nào để "nối" chuỗi stdout.


8
Đối với những người tìm kiếm trên chuỗi formating tài liệu của python: docs.python.org/library/stdtypes.html#string-formatting
guettli

1
Có vẻ như một câu hỏi tương tự đã được hỏi trước đây: https://stackoverflow.com/q/255147/9325817
Vignesh Bayari R.

Câu trả lời:


2535

Trong Python 3, bạn có thể sử dụng sep=end=các tham số của printhàm:

Để không thêm một dòng mới vào cuối chuỗi:

print('.', end='')

Để không thêm khoảng trắng giữa tất cả các đối số chức năng bạn muốn in:

print('a', 'b', 'c', sep='')

Bạn có thể truyền bất kỳ chuỗi nào cho một trong hai tham số và bạn có thể sử dụng cả hai tham số cùng một lúc.

Nếu bạn gặp sự cố với bộ đệm, bạn có thể xóa đầu ra bằng cách thêm flush=Trueđối số từ khóa:

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

Python 2.6 và 2.7

Từ Python 2.6, bạn có thể nhập printhàm từ Python 3 bằng __future__mô-đun :

from __future__ import print_function

cho phép bạn sử dụng giải pháp Python 3 ở trên.

Tuy nhiên, lưu ý rằng flushtừ khóa không có sẵn trong phiên bản của printhàm được nhập từ __future__Python 2; nó chỉ hoạt động trong Python 3, cụ thể hơn là 3.3 và mới hơn. Trong các phiên bản trước, bạn vẫn cần phải xóa thủ công bằng một cuộc gọi đến sys.stdout.flush(). Bạn cũng sẽ phải viết lại tất cả các câu lệnh in khác trong tệp nơi bạn thực hiện việc nhập này.

Hoặc bạn có thể sử dụng sys.stdout.write()

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

Bạn cũng có thể cần gọi

sys.stdout.flush()

để đảm bảo stdoutđược xả nước ngay lập tức.


2
Cảm ơn! Trong Python 3.6.3, flush = True là rất quan trọng, nếu không thì nó không hoạt động như dự định.
gunit

3
Ai đó có thể giải thích tại sao tôi cần flushvà nó thực sự làm gì không?
Rishav

5
Đã trễ vài tháng, nhưng để trả lời @Rishav tuôn ra bộ đệm và hiển thị đầu ra ngay bây giờ. Cuối cùng, bạn không thể in văn bản chính xác của mình, nhưng chỉ khi hệ thống xử lý đồ họa thay vì IO. Flush làm cho văn bản hiển thị ngay lập tức bằng cách "xóa" bộ đệm.
Rùa lớn

297

Nó nên đơn giản như được mô tả tại liên kết này của Guido Van Rossum:

Re: Làm thế nào để một bản in mà không có ac / r?

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

Có thể in một cái gì đó nhưng không tự động có một vận chuyển trở lại được gắn vào nó?

Có, thêm dấu phẩy sau đối số cuối cùng để in. Chẳng hạn, vòng lặp này in các số 0..9 trên một dòng cách nhau bởi khoảng trắng. Lưu ý "bản in" không tham số có thêm dòng mới:

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

99
Điều này được liệt kê cụ thể trong câu hỏi dưới dạng hành vi không mong muốn vì khoảng trắng
Zags

87
Ngược lại, câu trả lời nên bị xóa vì hai lý do: nó có tác dụng phụ không mong muốn mà bạn không thể vô hiệu hóa (bao gồm cả khoảng trắng thừa) và Nó không tương thích với python 3 (dấu ngoặc đơn buộc chuyển đổi thành tuple) . Tôi hy vọng các loại cấu trúc kém chất lượng này từ PHP, không phải Python. Vì vậy, tốt nhất là không bao giờ sử dụng này.
Eric Leschinski

9
//, Tuy nhiên, đây là cách đơn giản nhất để hoàn thành nó trong Python 2 và có rất nhiều mã một lần cho các HĐH thực sự cũ. Có lẽ không phải là giải pháp tốt nhất, hoặc thậm chí được đề nghị. Tuy nhiên, một trong những lợi thế lớn của StackOverflow là nó cho chúng ta biết những thủ thuật kỳ quặc nào đang tồn tại. KDP, bạn có bao gồm một cảnh báo nhanh ở đầu về những gì @Eric Leschinski nói không? Nó có ý nghĩa, sau tất cả.
Nathan Basan

23
@nathanbasan Đơn giản hay không, nó có tác dụng phụ mà người hỏi rõ ràng không muốn . Bị hạ bệ.
Shadur

8
270 câu trả lời cho một câu trả lời mà cụ thể là không trả lời câu hỏi. Làm tốt công việc nâng cao dân. Làm tốt lắm.
Hình trụ

168

Lưu ý: Tiêu đề của câu hỏi này từng là một cái gì đó như "Làm thế nào để inf trong python?"

Vì mọi người có thể đến đây để tìm kiếm nó dựa trên tiêu đề, Python cũng hỗ trợ thay thế kiểu 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

Và, bạn có thể nhân các giá trị chuỗi một cách thủ công:

>>> print "." * 10
..........

10
Thật vậy, nó là thiếu điểm. :) Vì đã có một câu trả lời tuyệt vời cho câu hỏi, tôi chỉ xây dựng một số kỹ thuật liên quan có thể hữu ích.
Beau

8
Dựa trên tiêu đề của câu hỏi, tôi tin rằng câu trả lời này tương tự phù hợp hơn với cách người ta thường sử dụng printf trong C / C ++
Dan

16
Điều này trả lời tiêu đề của câu hỏi, nhưng không phải là cơ thể. Điều đó nói rằng, nó cung cấp cho tôi những gì tôi đang tìm kiếm. :)
ayman

2
đó không phải là câu trả lời cho câu hỏi
Vanuan

4
@Vanuan, tôi đã giải thích ở cuối câu trả lời của tôi rằng tiêu đề của câu hỏi đã thay đổi tại một số điểm. :)
Beau

93

Sử dụng chức năng in kiểu python3 cho python2.6 + (cũng sẽ phá vỡ mọi câu lệnh in được từ khóa hiện có trong cùng một tệp.)

# for python2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

Để không làm hỏng tất cả các từ khóa in python2 của bạn, hãy tạo một printf.pytệp riêng

# printf.py

from __future__ import print_function

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

Sau đó, sử dụng nó trong tập tin của bạn

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

Thêm ví dụ cho thấy phong cách printf

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

39

Cách in trên cùng một dòng:

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

27

Hàm mới (kể từ Python 3.x) printcó một endtham số tùy chọn cho phép bạn sửa đổi ký tự kết thúc:

print("HELLO", end="")
print("HELLO")

Đầu ra:

XIN CHÀO

Ngoài ra còn có sepdải phân cách:

print("HELLO", "HELLO", "HELLO", sep="")

Đầu ra:

XIN CHÀO XIN CHÀO XIN CHÀO

Nếu bạn muốn sử dụng cái này trong Python 2.x, chỉ cần thêm cái này vào đầu tập tin của bạn:

from __future__ import print_function


1
"sep" làm gì?
McPeppr

1
@McPeppr Tôi biết rằng đây là cũ nhưng tôi đã chỉnh sửa câu trả lời cho rõ ràng hơn. Kiểm tra nó ngay bây giờ.
TheTechRobo36414519

Cảm ơn đã chỉnh sửa. sep sẽ có ích Cho đến nay tôi đã sử dụng sep.join (danh sách) để ghép các phần tử của danh sách với dấu phân cách ở giữa - hoàn hảo để ghi tệp csv
McPeppr

21

Sử dụng funcools.partial để tạo một hàm mới gọi là printf

>>> import functools

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

>>> printf("Hello world\n")
Hello world

Cách dễ dàng để bọc một chức năng với các tham số mặc định.


16

Bạn chỉ có thể thêm ,vào cuối printchức năng để nó không in trên dòng mới.


1
//, Điều này thực sự làm cho nó in ra không có gì. Sau đó, chúng ta không cần phải thêm một câu lệnh in khác mà không có đối số, như được hiển thị trong stackoverflow.com/a/493500/2146138 ? Bạn có sẵn sàng chỉnh sửa câu trả lời này bằng một ví dụ hai hoặc ba dòng ngắn gọn không?
Nathan Basan

3
OP không muốn có một không gian được nối thêm
pppery

2
Không trả lời câu hỏi. Không có khoảng trắng.
shrewmouse

Điều này không còn hoạt động trong Python 2.x và chỉ trả lời một nửa những gì OP muốn. Tại sao 16 upvote?
TheTechRobo36414519

12

Trong Python 3+, printlà một hàm. Khi bạn gọi

print('hello world')

Python dịch nó sang

print('hello world', end='\n')

Bạn có thể thay đổi endbất cứ điều gì bạn muốn.

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

8

trăn 2.6+ :

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

trăn 3 :

print('.', end='')

trăn <= 2,5 :

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

nếu không gian thêm ổn sau mỗi lần in, trong python 2

print '.',

gây hiểu lầm trong python 2 - tránh :

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

Bạn co thể thử:

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

Bạn có thể làm tương tự trong python3 như sau:

#!usr/bin/python

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

và thực hiện nó với python filename.pyhoặcpython3 filename.py


5

tôi gần đây đã có cùng một vấn đề ..

tôi đã giải quyết nó bằng cách làm:

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)

cái này hoạt động trên cả unix và windows ... chưa thử nghiệm nó trên macosx ...

thứ


2
Breakssys.__stdout__
pppery

4

@lenooh thỏa mãn câu hỏi của tôi. Tôi phát hiện ra bài viết này trong khi tìm kiếm 'python đàn áp dòng mới'. Tôi đang sử dụng IDLE3 trên Raspberry Pi để phát triển Python 3.2 cho PuTTY. Tôi muốn tạo một thanh tiến trình trên dòng lệnh PuTTY. Tôi không muốn trang cuộn đi. Tôi muốn một đường ngang để đảm bảo lại cho người dùng khỏi bối rối rằng chương trình đã không bị đình chỉ cũng như không được gửi đến bữa trưa trên một vòng lặp vô hạn vui vẻ - như một lời biện hộ để 'rời xa tôi, tôi đang làm tốt, nhưng điều này có thể mất một thời gian. ' thông điệp tương tác - giống như một thanh tiến trình trong văn bản.

Việc print('Skimming for', search_string, '\b! .001', end='')khởi tạo tin nhắn bằng cách chuẩn bị cho lần viết màn hình tiếp theo, nó sẽ in ba khoảng trống dưới dạng ⌫⌫⌫ rubout và sau đó là một khoảng thời gian, xóa sạch '001' và kéo dài dòng thời gian. Sau khi nhập search_stringvẹt người dùng,\b! cắt dấu chấm than của search_stringvăn bản của tôi để quay lại khoảng trống mà print()nếu không thì bắt buộc, đặt dấu câu đúng cách. Tiếp theo là một khoảng trắng và 'dấu chấm' đầu tiên của 'thanh tiến trình' mà tôi đang mô phỏng. Sau đó, thông báo cũng được mồi với số trang (được định dạng theo chiều dài ba với các số 0 đứng đầu) để thông báo cho người dùng rằng tiến trình đang được xử lý và cũng sẽ phản ánh số lượng thời gian mà chúng ta sẽ xây dựng sau đúng.

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

Các thanh thịt tiến độ là trong sys.stdout.write('\b\b\b.'+format(page, '03'))dòng. Đầu tiên, để xóa sang bên trái, nó sao lưu con trỏ qua ba ký tự số với '\ b \ b \ b' dưới dạng ⌫⌫⌫ và bỏ một khoảng thời gian mới để thêm vào chiều dài thanh tiến trình. Sau đó, nó viết ba chữ số của trang cho đến nay. Vì sys.stdout.write()chờ bộ đệm đầy đủ hoặc kênh đầu ra đóng,sys.stdout.flush() buộc phải ghi ngay lập tức. sys.stdout.flush()được xây dựng vào cuối của print()nó được bỏ qua với print(txt, end='' ). Sau đó, mã vòng lặp thông qua các hoạt động đòi hỏi nhiều thời gian trần tục của nó trong khi nó không in thêm gì nữa cho đến khi nó quay lại đây để xóa ba chữ số, thêm một dấu chấm và viết lại ba chữ số, tăng dần.

Ba chữ số được xóa và viết lại không có nghĩa là cần thiết - nó chỉ là một sự khởi sắc mà minh họa sys.stdout.write() so với print(). Bạn có thể dễ dàng truy cập vào một khoảng thời gian và quên đi ba dấu gạch chéo ngược ưa thích (tất nhiên là không ghi cả số trang được định dạng) bằng cách chỉ in thanh thời gian dài hơn một lần - không có dấu cách hoặc dòng mới chỉ sử dụng dấu cách sys.stdout.write('.'); sys.stdout.flush()đôi.

Xin lưu ý rằng trình vỏ Raspberry Pi IDLE3 Python không tôn trọng khoảng lùi dưới dạng ⌫ mà thay vào đó là in một khoảng trắng, thay vào đó tạo ra một danh sách phân số rõ ràng.

- (o = 8> wiz


4

Bạn sẽ nhận thấy rằng tất cả các câu trả lời trên là chính xác. Nhưng tôi muốn tạo một lối tắt để luôn luôn viết tham số "end = ''".

Bạn có thể định nghĩa một hàm như

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

Nó sẽ chấp nhận tất cả số lượng tham số. Thậm chí, nó sẽ chấp nhận tất cả các tham số khác như file, flush, v.v. và có cùng tên.


Nó không chạy, nó phàn nàn *arglúc ban đầu (python 2.7), và đặt nó ở cuối đã chạy, nhưng không hoạt động hoàn toàn đúng. Tôi đã định nghĩa một hàm chỉ lấy Print(*args), và sau đó chỉ gọi là in với sep='', end=''. Và bây giờ nó hoạt động như tôi muốn. Vì vậy, một upvote cho ý tưởng.
Otzen

4

Nhiều câu trả lời có vẻ hơi phức tạp. Trong Python 3.x bạn chỉ cần làm điều này:

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

Giá trị mặc định của kết thúc là "\n". Chúng tôi chỉ đơn giản là thay đổi nó thành một không gian hoặc bạn cũng có thể sử dụng end=""(không có không gian) để làm những gì printfbình thường.


3

bạn muốn in một cái gì đó cho vòng lặp đúng, nhưng bạn không muốn nó in dòng mới mỗi lần .. ví dụ:

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

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

nhưng bạn muốn nó in như thế này: hi hi hi hi hi hi hi phải không ???? chỉ cần thêm dấu phẩy sau khi in "hi"

Thí dụ:

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


5
Không, OP muốn hihihihihi, không phải hi hi hi hi hi
Cool Javelin

1

Hoặc có một chức năng như:

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

Ngay sau đó:

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

Đầu ra:

0123456789

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

Điều này hoạt động trong cả 2.7.8 & 2.5.2 (thiết bị đầu cuối Canopy và OSX) - không cần nhập mô-đun hoặc du hành thời gian.


8
Điều đó in các ký tự backspace đến đầu ra tiêu chuẩn. Nó có thể trông chính xác nếu đầu ra tiêu chuẩn xảy ra là một thiết bị đầu cuối, nhưng nếu nó được chuyển hướng đến một tệp mà tệp đó sẽ chứa các ký tự điều khiển.
Keith Thompson

1
Đúng, nhưng tôi không thể tưởng tượng rằng bất kỳ ai cũng muốn sử dụng cái này cho bất cứ thứ gì ngoài một thanh tiến bộ công nghệ thấp ...
ty tyome

1
Tuy nhiên, mã Python không làm điều tương tự như mã C trong câu hỏi.
Keith Thompson

bạn có thể kiểm tra sys.stdout.isatty()nếu không được chuyển hướng đến một tập tin.
fcm

0

Có hai cách chung để làm điều này:

In không có dòng mới trong Python 3.x

Không thêm gì sau câu lệnh in và xóa '\ n' bằng cách sử dụng end='' như:

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

Một ví dụ khác trong Loop :

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

In không có dòng mới trong Python 2.x

Thêm dấu phẩy cho biết sau khi in bỏ qua \n.

>>> print "hello",; print" world"
hello world

Một ví dụ khác trong Loop :

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

Hy vọng điều này sẽ giúp bạn. Bạn có thể truy cập liên kết này .


Còn không gian thì sao?
shrewmouse

sử dụng end=" "ví dụ: print ('hello', end = '' "); print ('world')
susan097

Giải pháp 2.7 của bạn không loại bỏ không gian.
shrewmouse

Tôi đề cập rằng loại bỏ '\ n' không phải không gian, không gian mặc định là python2. Xem những gì nó trông: print 'hello' ;print'there'trong paiza.io/projects/e353So9iUPfMdIORGzJTb2NQ
susan097

Đúng, đó là lý do tại sao câu trả lời của bạn đã bị bỏ phiếu. Bạn đã không trả lời câu hỏi "Làm thế nào để in mà không có dòng mới hoặc không gian?". Câu trả lời của bạn cho 2.x không trả lời câu hỏi. Bạn trả lời cho 3.0 cũng giống như nhiều câu trả lời khác đã được đăng hơn chín năm trước. Nói một cách đơn giản, câu trả lời này không thêm gì hữu ích cho cộng đồng và bạn nên xóa nó.
shrewmouse

-3

... bạn không cần nhập bất kỳ thư viện nào. Chỉ cần sử dụng ký tự xóa:

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

việc này sẽ xóa dòng mới và dấu cách (^ _ ^) *

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.