تتبع تقدم تحميل الملف في بايثون
سؤال
تقوم الكثير من الوحدات التي أستخدمها باستيراد ملفات كاملة إلى الذاكرة أو نقل محتويات الملف أثناء معالجتها.أتساءل عما إذا كان هناك أي طريقة لتتبع هذا النوع من تقدم التحميل؟ربما فئة مجمعة تأخذ رد الاتصال؟
المحلول
سأفعل ذلك عن طريق تحديد حجم الملف، ثم ببساطة قسمة الإجمالي على عدد البايتات المقروءة.مثله:
import os
def show_progress(file_name, chunk_size=1024):
fh = open(file_name, "r")
total_size = os.path.getsize(file_name)
total_read = 0
while True:
chunk = fh.read(chunk_size)
if not chunk:
fh.close()
break
total_read += len(chunk)
print "Progress: %s percent" % (total_read/total_size)
yield chunk
for chunk in show_progress("my_file.txt"):
# Process the chunk
pass
يحرر: أعرف أنه ليس الكود الأفضل، لكني أردت فقط أن أعرض الفكرة.
نصائح أخرى
إذا كنت تعني في الواقع "استيراد" (وليس "قراءة") ثم يمكنك تجاوز التعاريف وحدة الاستيراد. يمكنك إضافة قدرات توقيت.
عفريت حدة.
إذا كنت تعني "قراءة"، ثم يمكنك لف مسلي ملفات بيثون مع المجمع مثل الملف الخاص بك. الملفات لا تعرض الكثير من الطرق. يمكنك تجاوز تلك مثيرة للاهتمام للحصول على توقيت البيانات.
>>> class MyFile(file):
... def read(self,*args,**kw):
... # start timing
... result= super(MyFile,self).read(*args,**kw)
... # finish timing
... return result
لا تنتمي إلى StackOverflow