چاپ سطر جدید روی آخرین سطر چاپ شده

اگه با ترمینال سروکار داشته باشید حتما برنامه‌هایی رو دیدی که خروجی رو بصورت یک سطر ولی پویا به کاربر نشون میدن. برای مثال curl، axel و … خروجی رو توی یک سطر نمایش ‌میدن. ولی سوال اینجاست که چجوری؟
پیش از اینکه بریم سراغ چگونه انجام دادن این کار اجازه بدید سوالی رو مطرح کنم. تا حالا شده بخواید یک فایل متنی رو توی برنامه خودتون بخونید سطر به سطر جدا کنید ولی استفاده از \n مشکلتون رو حل نکرده باشه و بعد از جستجو یا دانسته‌های قبلی \r رو هم استفاده بکنید؟ (البته من اینجا کاری ندارم که این کی پیش میاد و چرا ولی اگه با ویندوز کار کرده باشید احتمال زیاد با این مشکل روبرو شدید)
خب اگه این اتفاق براتون افتاده یا می‌دونید که \rچیکار می‌کنه شما خودتون قبلا راه حل سوال اولمون (اینکه چجوری میشه یک سطر رو پاک و چاپ کرد) رو بلدید.

هر اینتری که شما روی کیبرد خودتون فشار میدید درحقیقت دو کاراکتر است، یک کاراکتر \r که میگه اشاره گر به ابتدای سطر منتقل بشه و کاراکتر \n که میگه اشاره گر تو همین پوزیشن طولی یک سطر به پایین حرکت بکنه

برای اینکه یک سطر رو دوباره چاپ کنیم کافیه از کاراکتر \r استفاده کنیم و اشاره‌گر رو به ابتدای سطر برده و متن مورد نظر خودمون رو چاپ کنیم

1
2
print "***** World",
print "\rHello"

یا بشکل دیگه

1
2
3
4
import sys
sys.stdout.write("***** World")
sys.stdout.write("\rHello")
sys.stdout.flush()

این مثال خوبی‌ای که داشت اینه که متوجه این نکته میشیم که سطر پاک نمیشه و فقط متن جدیدی که چاپ کردیم رو متن قبلی میشینه و اگه متن جدید کوتاه‌تر از متن قبلی باشه کاراکتر‌های متن قبلی همچنان باقی می‌مونند. اگه می‌خواید کل سطر عوض بشه باید حواستون به این مورد باشه. روشی که عموما برای رفع این مشکل استفاده میشه اینه که سطر خروجی همیشه تعداد کاراکتر ثابتی داره.