كيف أكتب الإخراج في نفس المكان على وحدة التحكم؟

StackOverflow https://stackoverflow.com/questions/517127

  •  21-08-2019
  •  | 
  •  

سؤال

أنا جديد على لغة بايثون وأقوم بكتابة بعض البرامج النصية لأتمتة تنزيل الملفات من خوادم FTP، وما إلى ذلك.أريد إظهار تقدم عملية التنزيل، ولكن أريد أن يبقى في نفس الوضع، مثل:

انتاج:

تنزيل الملف FooFile.txt [47%]

أحاول تجنب شيء مثل هذا:

     Downloading File FooFile.txt [47%]
     Downloading File FooFile.txt [48%]
     Downloading File FooFile.txt [49%]

كيف يجب أن أفعل هذا؟


ينسخ: كيف يمكنني الطباعة عبر السطر الحالي في تطبيق سطر الأوامر؟

هل كانت مفيدة؟

المحلول

يمكنك أيضًا استخدام حرف الإرجاع:

sys.stdout.write("Download progress: %d%%   \r" % (progress) )
sys.stdout.flush()

نصائح أخرى

استخدم مكتبة التعامل مع المحطة الطرفية مثل وحدة الشتائم:

توفر وحدة اللعنات واجهة لمكتبة اللعنات، وهي المعيار الفعلي للتعامل مع الأجهزة الطرفية المتقدمة المحمولة.

بايثون 2

أحب ما يلي:

print 'Downloading File FooFile.txt [%d%%]\r'%i,

العرض التوضيحي:

import time

for i in range(100):
    time.sleep(0.1)
    print 'Downloading File FooFile.txt [%d%%]\r'%i,

بايثون 3

print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

العرض التوضيحي:

import time

for i in range(100):
    time.sleep(0.1)
    print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

طباعة حرف مسافة للخلف \b عدة مرات، ثم قم باستبدال الرقم القديم بالرقم الجديد.

#kinda like the one above but better :P

from __future__ import print_function
from time import sleep

for i in range(101):
  str1="Downloading File FooFile.txt [{}%]".format(i)
  back="\b"*len(str1)
  print(str1, end="")
  sleep(0.1)
  print(back, end="")

بالنسبة لبيثون 3xx:

import time
for i in range(10):
    time.sleep(0.2) 
    print ("\r Loading... {}".format(i)+str(i), end="")

الحل الأنيق الذي كان يعمل بالنسبة لي هو:

from __future__ import print_function
import sys
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r')
    sys.stdout.flush()
print("")

ال sys.stdout.flush من المهم وإلا فإنه يصبح عالي الكعب حقًا و print("") يعد تشغيل الخروج من الحلقة أمرًا مهمًا أيضًا.

تحديث:كما ذكر في التعليقات print لديها أيضا flush دعوى.لذلك سوف يعمل ما يلي أيضًا:

from __future__ import print_function
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r', flush=True)
print("")
x="A Sting {}"
   for i in range(0,1000000):
y=list(x.format(i))
print(x.format(i),end="")

for j in range(0,len(y)):
    print("\b",end="")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top