\ r ใน Python ไม่ได้ลบทั้งบรรทัด

Aug 31 2020

ฉันมีปัญหาที่ค่อนข้างซับซ้อน แต่นี่คือ "เวอร์ชันที่ง่ายที่สุด" เพื่อให้คุณเข้าใจได้ดีขึ้น

import time
for i in range(10):
   time.sleep(1)
   print('{}\r'.format(i), end="")

และที่นี่ทุกอย่างทำงานได้ดีปัญหาเกิดขึ้นเมื่อฉันพยายามนับถอยหลัง

import time
for i in range(10):
   time.sleep(1)
   print('{}\r'.format(10-i), end="")

ผลลัพธ์คือ 10 ... จากนั้น 90 ... 80 ... 70 และอื่น ๆ ดูเหมือนว่าถ้าการเข้ารหัสที่สองของ 10 ไม่ถูกยกเลิก ใครช่วยบอกทีว่าทำไม

คำตอบ

2 tzaman Aug 31 2020 at 01:46

\rเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัด แต่จะไม่ "ล้าง" สิ่งที่พิมพ์ไปแล้วเว้นแต่คุณจะเขียนทับ (ซึ่งอาจขึ้นอยู่กับแพลตฟอร์ม) ดังนั้น0อักขระจะยังคงปรากฏให้เห็น คุณสามารถจัดการกับสิ่งนั้นได้โดยการพิมพ์คอลัมน์ "ความกว้างคงที่" เสมอเพื่อให้มีการพิมพ์ช่องว่างเพื่อลบสิ่งที่เหลือจากก่อนหน้านี้ คุณยังใส่ CR ในendพารามิเตอร์ได้อีกด้วย
ด้วยประการฉะนี้:

import time
for i in range(10):
   time.sleep(1)
   print('{: <3}'.format(10-i), end='\r')

นี้ใช้ระบุรูปแบบเพื่อระบุ พื้นที่ที่เต็มไปด้วย<ซ้ายชิด3คอลัมน์กว้าง คุณสามารถเปลี่ยนเป็น3ตัวเลขที่สูงขึ้นได้ขึ้นอยู่กับจำนวนหลักที่คุณต้องการ

1 ManasSambare Aug 31 2020 at 01:42

เกิดจากข้อผิดพลาดง่ายๆคุณไม่มีช่องว่างก่อนหน้า \ r:

รหัสของคุณ:

   print('{}\r'.format(10-i), end="")
   # > 10,90,80

เปลี่ยนเป็น:

   print('{} \r'.format(10-i), 
   #> 10, 9, 8
1 venky__ Aug 31 2020 at 01:44

ปัญหาก็เหมือนกับเครื่องพิมพ์ดีดรุ่นเก่าเมื่อคุณกด\rแคร่กลับไปที่บรรทัดเริ่มต้นและไล่อักขระหนึ่งตัวจากที่นั่น ดังนั้น 10 จะกลายเป็น 90 เมื่ออักขระตัวแรกเปลี่ยนไป

import time
for i in range(10):
    time.sleep(1)
    print('{:02d}'.format(10-i), end="\r")

ทางออกที่เป็นไปได้อย่างหนึ่งคือการกำหนดความกว้าง ที่นี่ฉันทำให้เป็นตัวเลข 2 หลัก