2012-03-25 46 views
11

cách bạn ghi đè lên bản in trước đó trong python 2.7? Tôi đang thực hiện một chương trình đơn giản để tính pi. đây là mã số:python ghi đè dòng trước

o = 0 
hpi = 1.0 
i = 1 
print "pi calculator" 
acc= int(raw_input("enter accuracy:")) 
if(acc>999999): 
     print "WARNING: this might take a VERY long time. to terminate, press CTRL+Z" 
print "precision: " + str(acc) 
while i < acc: 
     if(o==0): 
       hpi *= (1.0+i)/i 
       o = 1 
     elif(o==1): 
       hpi *= i/(1.0+i) 
       o = 0 
     else: 
       print "loop error." 
     i += 1 
     if i % 100000 == 0: 
       print str(hpi*2)) 
print str(hpi*2)) 

Kết quả cơ bản là kết quả pi hiện tại sau 100000 phép tính. làm thế nào tôi có thể làm cho nó ghi đè lên các tính toán trước đó?

Trả lời

19

Làm tiền tố đầu ra của bạn bằng biểu tượng trả về vận chuyển '\r' và không kết thúc bằng biểu tượng cấp dữ liệu dòng '\n'. Điều này sẽ đặt con trỏ ở đầu dòng hiện tại, vì vậy đầu ra sẽ ghi đè lên nội dung của nó trước đó. Pad nó với một số khoảng trắng trống để đảm bảo ghi đè. Ví dụ.

sys.stdout.write('\r' + str(hpi) + ' ' * 20) 
sys.stdout.flush() # important 

Xuất giá trị cuối cùng như thường lệ với print.

Tôi tin rằng điều này sẽ làm việc cả trong hầu hết các trình giả lập thiết bị đầu cuối * nix và bảng điều khiển Windows. YMMV, nhưng đây là cách đơn giản nhất.

+1

Trên một số nền tảng ''\ r'' only" xóa "một ký tự (tương tự như phím xóa lùi), vì vậy trong trường hợp đó bạn sẽ phải theo dõi bạn lớn dòng cuối cùng của bạn và thêm nhiều Các ký tự '\ r' vào dòng tiếp theo của bạn, hoặc đơn giản hơn là luôn luôn có đầu ra chiều dài cố định đệm (ví dụ: sử dụng 'str.rjust (...)') –

+0

thx, đó chỉ là những gì tôi cần. – Cinder

4

Khám phá this answer. Về cơ bản \r hoạt động tốt, nhưng bạn phải chắc chắn rằng bạn in mà không có các ký tự dòng mới.

cnt = 0 
print str(cnt) 
while True: 
    cnt += 1 
    print "\r" + str(cnt) 

Điều này sẽ không hoạt động vì bạn in một dòng mới mọi lúc và \r chỉ cần quay lại dòng mới trước đó.

Thêm dấu phẩy vào câu lệnh print sẽ ngăn không cho nó in dòng mới, vì vậy \b sẽ quay lại phần đầu của dòng bạn vừa viết và bạn có thể ghi đè lên nó.

cnt = 0 
print str(cnt), 
while True: 
    cnt += 1 
    print "\r" + str(cnt),