Hướng dẫn replace previous print python - thay thế python in trước đó

Phiên bản đơn giản

Một cách là sử dụng ký tự trả về vận chuyển [

for x in range[10]:
    print '{0}\r'.format[x],
print
5] để trở về đầu dòng mà không tiến tới dòng tiếp theo.

Python 3

for x in range[10]:
    print[x, end='\r']
print[]

Python 2.7 tương thích về phía trước

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]

Python 2.7

for x in range[10]:
    print '{}\r'.format[x],
print

Python 2.0-2.6

for x in range[10]:
    print '{0}\r'.format[x],
print

Trong hai trường hợp sau [chỉ có 2 [Python 2], dấu phẩy ở cuối câu lệnh in cho biết họ không đi đến dòng tiếp theo. Câu lệnh in cuối cùng tiến lên dòng tiếp theo để lời nhắc của bạn sẽ không ghi đè lên đầu ra cuối cùng của bạn.

Làm sạch dòng

Nếu bạn có thể đảm bảo rằng dòng văn bản mới không ngắn hơn dòng hiện tại, thì bạn chỉ cần thêm một chuỗi rõ ràng để kết thúc chuỗi thoát khỏi dòng,

for x in range[10]:
    print '{0}\r'.format[x],
print
6 [
for x in range[10]:
    print '{0}\r'.format[x],
print
7 = ESC]:

for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]

Đã trả lời ngày 24 tháng 3 năm 2011 lúc 12:56Mar 24, 2011 at 12:56

Mike Desimonemike DesimoneMike DeSimone

40.6K10 Huy hiệu vàng71 Huy hiệu bạc95 Huy hiệu Đồng10 gold badges71 silver badges95 bronze badges

12

Kể từ khi tôi kết thúc ở đây thông qua Google nhưng đang sử dụng Python 3, đây là cách thức hoạt động của Python 3:

for x in range[10]:
    print["Progress {:2.1%}".format[x / 10], end="\r"]

Câu trả lời liên quan ở đây: Làm thế nào tôi có thể đàn áp dòng mới sau một câu lệnh in?

Đã trả lời ngày 17 tháng 2 năm 2014 lúc 21:56Feb 17, 2014 at 21:56

PascalpascalPascal

16.7K4 Huy hiệu vàng59 Huy hiệu bạc67 Huy hiệu Đồng4 gold badges59 silver badges67 bronze badges

4

@Mike Desimone Trả lời có thể sẽ hoạt động hầu hết thời gian. Nhưng mà...

for x in ['abc', 1]:
    print '{}\r'.format[x],

-> 1bc

Điều này là do

for x in range[10]:
    print '{0}\r'.format[x],
print
5 chỉ quay trở lại đầu dòng nhưng không xóa đầu ra.

Nếu hỗ trợ POSIX là đủ cho bạn, thì điều sau đây sẽ xóa dòng hiện tại và để con trỏ lúc bắt đầu:

print '\x1b[2K\r',

Nó sử dụng mã thoát ANSI để xóa dòng thiết bị đầu cuối. Thông tin thêm có thể được tìm thấy trong Wikipedia và trong cuộc nói chuyện tuyệt vời này.

Cách tiếp cận khác

Giải pháp khác, [có thể nói tồi tệ hơn] mà tôi đã tìm thấy trông như thế này:

last_x = ''
for x in ['abc', 1]:
    print ' ' * len[str[last_x]] + '\r',
    print '{}\r'.format[x],
    last_x = x

-> 1

Một lợi thế là nó cũng sẽ hoạt động trên Windows.

Tế bào thần kinh

4.6824 Huy hiệu vàng33 Huy hiệu bạc54 Huy hiệu Đồng4 gold badges33 silver badges54 bronze badges

Đã trả lời ngày 3 tháng 8 năm 2014 lúc 13:27Aug 3, 2014 at 13:27

Nagasaki45Nagasaki45Nagasaki45

2.4641 Huy hiệu vàng21 Huy hiệu bạc27 Huy hiệu đồng1 gold badge21 silver badges27 bronze badges

1

Tôi đã có cùng một câu hỏi trước khi truy cập chủ đề này. Đối với tôi, sys.stdout.write chỉ hoạt động nếu tôi xả đúng bộ đệm, tức là.

for x in range[10]:
    sys.stdout.write['\r'+str[x]]
    sys.stdout.flush[]

Không cần xả, kết quả chỉ được in ở cuối tập lệnh

Sна đ шƒаӽ

15.8K12 Huy hiệu vàng73 Huy hiệu bạc87 Huy hiệu đồng12 gold badges73 silver badges87 bronze badges

Đã trả lời ngày 2 tháng 8 năm 2015 lúc 23:47Aug 2, 2015 at 23:47

user2793078user2793078user2793078

3996 Huy hiệu bạc12 Huy hiệu Đồng6 silver badges12 bronze badges

2

Bị ngăn chặn dòng mới và in

for x in range[10]:
    print '{0}\r'.format[x],
print
9.

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
0

Hoặc viết thư cho stdout:

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
1

ASHASTRAL

2.7581 Huy hiệu vàng20 Huy hiệu bạc32 Huy hiệu Đồng1 gold badge20 silver badges32 bronze badges

Đã trả lời ngày 24 tháng 3 năm 2011 lúc 12:53Mar 24, 2011 at 12:53

0

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
2

Time.Sleep [0.5] là để hiển thị cách xóa đầu ra trước đó và đầu ra mới được in "\ r" khi nó bắt đầu thông báo in, nó sẽ xóa đầu ra trước đó trước đầu ra mới.

Zim

3893 Huy hiệu bạc13 Huy hiệu Đồng3 silver badges13 bronze badges

Đã trả lời ngày 9 tháng 4 năm 2017 lúc 3:20Apr 9, 2017 at 3:20

RubixRedrubixredRubixred

Huy hiệu đồng 1491 Bạc4 Huy hiệu đồng1 silver badge4 bronze badges

Thử cái này:

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
3

Nó làm việc cho tôi. Phần

for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
0 đang làm cho nó ghi đè lên dòng trước.

WARNING!

Nếu bạn in ra

for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
1, sau đó in ra
for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
2 bằng
for x in range[10]:
    print '{0}\r'.format[x],
print
9, bạn sẽ nhận được
for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
4 vì đầu ra đã viết qua hai chữ cái trước đó. Nếu bạn in ra
for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
1 với không gian [mà don lồng hiển thị ở đây], thì nó sẽ xuất ra
for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
1. Để khắc phục điều này, in ra không gian bằng
for x in range[10]:
    print '{0}\r'.format[x],
print
9.

Đã trả lời ngày 20 tháng 6 năm 2016 lúc 0:20Jun 20, 2016 at 0:20

E.T.E.T.E.T.

5845 Huy hiệu bạc16 Huy hiệu đồng5 silver badges16 bronze badges

2

Điều này hoạt động trên Windows và Python 3.6

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
4

Đã trả lời ngày 1 tháng 8 năm 2018 lúc 17:16Aug 1, 2018 at 17:16

Dưới đây là phiên bản "Plug-and-Play", của câu trả lời của @nagasaki45. Không giống như nhiều câu trả lời khác ở đây, nó hoạt động đúng với các chuỗi có độ dài khác nhau. Nó đạt được điều này bằng cách xóa dòng với nhiều khoảng trống như chiều dài của dòng in cuối cùng được in. Cũng sẽ hoạt động trên Windows.

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
5

Cách sử dụng

Đơn giản chỉ cần sử dụng nó như thế này:

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
6

Thử nghiệm nhỏ này cho thấy các dòng được xóa đúng cách, ngay cả đối với các độ dài khác nhau:

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
7

Đã trả lời ngày 13 tháng 5 năm 2017 lúc 10:46May 13, 2017 at 10:46

Erberberb

13.4K4 Huy hiệu vàng30 Huy hiệu bạc35 Huy hiệu đồng4 gold badges30 silver badges35 bronze badges

1

Tôi không thể nhận được bất kỳ giải pháp nào trên trang này để làm việc cho Ipython, nhưng một biến thể nhỏ trên giải pháp của @Mike-Desimone đã thực hiện công việc: thay vì chấm dứt dòng với việc trả lại vận chuyển, hãy bắt đầu dòng trở lại vận chuyển:IPython, but a slight variation on @Mike-Desimone's solution did the job: instead of terminating the line with the carriage return, start the line with the carriage return:

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
8

Ngoài ra, phương pháp này không yêu cầu câu lệnh in thứ hai.

Đã trả lời ngày 22 tháng 4 năm 2015 lúc 22:22Apr 22, 2015 at 22:22

David Marxdavid MarxDavid Marx

7,8143 huy hiệu vàng41 Huy hiệu bạc62 Huy hiệu đồng3 gold badges41 silver badges62 bronze badges

3

Câu trả lời được chấp nhận là không hoàn hảo. Dòng được in đầu tiên sẽ ở đó và nếu bản in thứ hai của bạn không bao gồm toàn bộ dòng mới, bạn sẽ kết thúc bằng văn bản rác.

Để minh họa vấn đề, hãy lưu mã này dưới dạng tập lệnh và chạy nó [hoặc chỉ xem xét]:

from __future__ import print_function
for x in range[10]:
    print[x, end='\r']
print[]
9

Đầu ra sẽ trông giống như thế này:

for x in range[10]:
    print '{}\r'.format[x],
print
0

Điều làm việc cho tôi là xóa dòng trước khi để lại một bản in vĩnh viễn. Vui lòng điều chỉnh vấn đề cụ thể của bạn:

for x in range[10]:
    print '{}\r'.format[x],
print
1

Và bây giờ nó in như mong đợi:

for x in range[10]:
    print '{}\r'.format[x],
print
2

Đã trả lời ngày 17 tháng 7 năm 2018 lúc 20:48Jul 17, 2018 at 20:48

Mimoraleamimoraleamimoralea

9.2197 Huy hiệu vàng55 Huy hiệu bạc55 Huy hiệu Đồng7 gold badges55 silver badges55 bronze badges

Tôi hơi ngạc nhiên khi không ai sử dụng ký tự backspace. Đây là một cái sử dụng nó.

for x in range[10]:
    print '{}\r'.format[x],
print
3

Đã trả lời ngày 6 tháng 2 năm 2018 lúc 20:09Feb 6, 2018 at 20:09

1

Đây là giải pháp của tôi! Windows 10, Python 3.7.1

Tôi không chắc tại sao mã này hoạt động, nhưng nó hoàn toàn xóa dòng ban đầu. Tôi đã tổng hợp nó từ các câu trả lời trước đó. Các câu trả lời khác sẽ chỉ đưa dòng trở lại từ đầu, nhưng nếu bạn có một dòng ngắn hơn sau đó, nó sẽ trông lộn xộn như

for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
2 biến thành
for x in range[75]:
    print['*' * [75 - x], x, end='\x1b[1K\r']
print[]
9.

for x in range[10]:
    print '{}\r'.format[x],
print
4

Đầu ra - Mỗi dòng sẽ được viết lại mà không có bất kỳ văn bản cũ nào hiển thị:

for x in range[10]:
    print '{}\r'.format[x],
print
5

Dòng tiếp theo [viết lại hoàn toàn trên cùng một dòng]:

for x in range[10]:
    print '{}\r'.format[x],
print
6

Đã trả lời ngày 19 tháng 12 năm 2018 lúc 1:12Dec 19, 2018 at 1:12

[Python3] Đây là những gì làm việc cho tôi. Nếu bạn chỉ sử dụng \ 010 thì nó sẽ để lại các ký tự, vì vậy tôi đã điều chỉnh nó một chút để đảm bảo rằng nó ghi đè lên những gì đã ở đó. Điều này cũng cho phép bạn có một cái gì đó trước mục in đầu tiên và chỉ xóa chiều dài của mục.

for x in range[10]:
    print '{}\r'.format[x],
print
7

Đã trả lời ngày 8 tháng 8 năm 2019 lúc 0:53Aug 8, 2019 at 0:53

Thêm một câu trả lời dựa trên các câu trả lời trước.

Nội dung của pbar.py: nhập sys, showil, datetime

for x in range[10]:
    print '{}\r'.format[x],
print
8

Việc sử dụng kịch bản:

for x in range[10]:
    print '{}\r'.format[x],
print
9

Đã trả lời ngày 8 tháng 10 năm 2019 lúc 12:12Oct 8, 2019 at 12:12

KriszkriszKrisz

6716 Huy hiệu bạc21 Huy hiệu đồng6 silver badges21 bronze badges

Tốt hơn để ghi đè toàn bộ dòng nếu không dòng mới sẽ trộn với các dòng cũ nếu dòng mới ngắn hơn.

for x in range[10]:
    print '{0}\r'.format[x],
print
0

Phải sử dụng

for x in range[10]:
    print["Progress {:2.1%}".format[x / 10], end="\r"]
0 trên Windows.

Đã trả lời ngày 12 tháng 8 năm 2020 lúc 11:24Aug 12, 2020 at 11:24

Điều này làm việc cho tôi, sử dụng Python 3.7.9 trong Spyder, trong Windows:

for x in range[10]:
    print '{0}\r'.format[x],
print
1

Đã trả lời ngày 1 tháng 4 năm 2021 lúc 23:04Apr 1, 2021 at 23:04

Dù sao nếu ai đó muốn in ấn [rõ ràng] một số đường được in trước đó trong stdout, thì câu trả lời này sẽ hữu ích cho anh ta. [Cảm ơn Thijmen Dam vì bài viết hay ghi đè các dòng được in trước đó]many lines previously printed in stdout, than this answer should be helpful for him. [Thanks Thijmen Dam for the nice article Overwrite Previously Printed Lines]

Trong bảng điều khiển ANSI, bạn có thể sử dụng các chuỗi đặc biệt:

for x in range[10]:
    print["Progress {:2.1%}".format[x / 10], end="\r"]
1 và
for x in range[10]:
    print["Progress {:2.1%}".format[x / 10], end="\r"]
2

Đầu tiên trong số họ nâng một con trỏ, thứ hai - xóa hoàn toàn một dòng.

Ví dụ về việc thanh toán bù trừ một bàn điều khiển [Python 3]:

for x in range[10]:
    print '{0}\r'.format[x],
print
2

hoặc cuối cùng chỉ đơn giản [sẽ xóa màn hình và di chuyển con trỏ đến 0,0]:

for x in range[10]:
    print '{0}\r'.format[x],
print
3

Nếu bạn chỉ muốn định vị con trỏ, thì hãy sử dụng điều này:

for x in range[10]:
    print '{0}\r'.format[x],
print
4

trong đó

for x in range[10]:
    print["Progress {:2.1%}".format[x / 10], end="\r"]
3 và
for x in range[10]:
    print["Progress {:2.1%}".format[x / 10], end="\r"]
4 là dòng và cột tương ứng.

Tài liệu tham khảo cho bạn trình tự thoát ANSI

Đã trả lời ngày 5 tháng 5 lúc 22:16May 5 at 22:16

Yan Pakyan PakYan Pak

1.6772 Huy hiệu vàng19 Huy hiệu bạc13 Huy hiệu đồng2 gold badges19 silver badges13 bronze badges

Bài Viết Liên Quan

Chủ Đề