اذهب إلى المحتوى
  • 0

تحميل الملفات الضخمة من الإنترنت عبر بايثون ورسم مؤشر تتبع تقدم التحميل

Fahmy Mostafa

السؤال

قمت من فترة قصيرة بعمل سكربت لتحميل الملفات (أشبه بمدير تحميل الملفات)، لكن المشكلة هي أنني لا يمكنني أن أقوم بتحميل الملفات الكبيرة من الإنترنت، فعلى سبيل المثال أريد تحميل نسخة من نظام التشغيل Ubuntu من خلال هذا البرنامج، كيف أقوم بتحميل ملف بحجم أكبر من 1.5 جيجابايت؟ هل يمكن إستخدام طريقة chunks لعمل ذلك؟ وهل يمكنني عمل شريط تحميل لعرض نسبة اكتمال التحميل؟

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يمكن استخدام المكتبة request وعمل قناة اتصال منها، وتحديد أجزاء صغير من الملف chunks ومن ثم تحميلها وتجميعها في ملف ثم كتابته على القرص المحلي:

حيث أن هذه الطريقة المستخدمة لتحميل الملفات الكبيرة عن طريق تقسيمها..

def download_file(url):
  	# جلب اسم الملف من الرابط
    local_filename = url.split('/')[-1]
    # تفعيل عمل قناة الاتصال stream=True 
    with requests.get(url, stream=True) as r:
        r.raise_for_status() # رفع استثناء إن حصل أي مشكلة في الاتصال
        # تجهيز ملف محلي لتخزين البيانات
        with open(local_filename, 'wb') as f:
            # تحديد حجم جزء الملف
            for chunk in r.iter_content(chunk_size=8192):
            	if chunk:  # تحقق من تحميل الجزء
                    # كابة الجزء المحمل من خلال قناة الاتصال
                    f.write(chunk)
    return local_filename

 

ولعمل مسار تقدم التحميل يمكن استخدام مكتبة "تقدم" tqdm وهي الأصل في التسمية لعمل progress bar:

from tqdm import *
import requests
url = "https://path/to/file.mp4"
name = "video"
with requests.get(url, stream=True) as r:
    r.raise_for_status() # رفع استثناء إن حصل أي مشكلة في الاتصال
    with open(name, 'wb') as f:
        pbar = tqdm(total=int(r.headers['Content-Length']))#تهيئة عمودالتحميل بطول البيانات = حجم الملف
        for chunk in r.iter_content(chunk_size=8192):
            if chunk:  # تحقق من تحميل الجزء
                f.write(chunk)
                pbar.update(len(chunk)) # تحديث التقدم في عمود التحميل

كلما تم تحميل جزء من الملف، يتم حساب طول هذه الجزء من طول الملف الأصلي وتحرك المؤشر في عمود التقدم ليملأ فراغ بنفس الحجم.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك تنزيل الملفات الكبيرة عبر تقسيمها وتنزيلها أجزاء chunks ، وإذا أردت الحصول على مؤشر تتبع تقدم التحميل فهناك عدة طرق لذلك وهذا مثال للتنزيل كأجزاء مع مؤشر تتبع تقدم التحميل

from clint.textui import progress

r = requests.get(url, stream=True)
path = '/some/path/for/file.txt'
with open(path, 'wb') as f:
    total_length = int(r.headers.get('content-length')) # حساب الحجم الكلي
    for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): # تنزيل أجزاء بحجم 1024 بايت
        if chunk:
            f.write(chunk)
            f.flush()

ومؤشر تتبع تقدم التحميل سيظهر كالآتي

[################################] 5210/5210 - 00:00:01

أو يمكنك تثبيت wget

pip install wget

وإستخدامها كالآتي

import wget
wget.download('http://download.geonames.org/export/zip/US.zip')

والمُخرجات ستظهر كالآتي

11% [........                                     ] 73728 / 633847

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...