تحدي التحقق من حجم الملف قبل التحميل باستخدام بايثون
عند البرمجة بلغة بايثون، وخاصة عند التعامل مع تحميل الملفات، قد يكون من الم frustrات معرفة حجم الملفات قبل بدء عملية التحميل. وغالبًا ما تظهر هذه الحالة عندما ترغب في مقارنة حجم الملف على الخادم مع النسخة المحلية للتحقق مما إذا كان هناك تحديث متاح. في منشور المدونة هذا، سنستكشف كيفية استرداد حجم الملف من الخادم باستخدام مكتبة urllib
في بايثون، وسنُعالج المشكلات الشائعة التي قد تحدث خلال هذه العملية.
فهم المشكلة
افترض أنك تقوم بتحميل ملفات من خادم ويب، مثل ملفات .TXT أو .ZIP. لاحظت أنه على الرغم من أن عملية التحميل تتم بنجاح، إلا أنه لا يمكنك تحديد ما إذا كان الملف قد تم تحديثه على الخادم إلا إذا قمت بتحميله. من الناحية المثالية، ترغب في معرفة حجم الملف مسبقًا لإجراء مقارنة. يمكن أن تعقد الطرق المختلفة لتحميل الملفات والتعامل معها هذه المهمة، خاصة مع مشاكل مثل تحويلات نهايات الأسطر التي يمكن أن تؤدي إلى فروق في الحجم.
الحل: استرداد حجم الملف قبل التحميل
للحصول على حجم ملف قبل تحميله، اتبع هذه الخطوات باستخدام مكتبة urllib
لإرسال طلب واسترداد حجم الملف.
الخطوة 1: استيراد المكتبات المطلوبة
سنحتاج إلى استيراد مكتبات urllib
و os
للتعامل مع طلبات HTTP والتفاعل مع نظام الملفات.
import urllib
import os
الخطوة 2: فتح رابط الملف
الخطوة الأولى هي فتح الرابط من الذي تريد تحميل الملف.
link = "http://www.someurl.com/myfile.txt"
site = urllib.urlopen(link)
الخطوة 3: استرداد البيانات الوصفية
بمجرد فتح الموقع، يمكنك استرداد البيانات الوصفية التي تتضمن حجم الملف (Content-Length) باستخدام طريقة info()
.
meta = site.info()
file_size = int(meta.getheaders("Content-Length")[0])
print(f"Content-Length: {file_size}")
هذا سيعطيك حجم الملف على الخادم الذي يمكنك تخزينه في متغير لمقارنة لاحقة.
الخطوة 4: التحقق من حجم الملف المحلي
قبل التحميل، يجب عليك أيضًا التحقق من حجم الملف المحلي (إذا كان موجودًا). يمكن القيام بذلك باستخدام وحدة os
.
if os.path.isfile("myfile.txt"):
local_size = os.stat("myfile.txt").st_size
print(f"Local file size: {local_size}")
else:
local_size = 0
الخطوة 5: المقارنة والتحميل
الآن بعد أن لديك كلا الحجمين، يمكنك مقارنتهما لتحديد ما إذا كنت بحاجة إلى تحميل الملف المحدث.
if file_size != local_size:
print("Downloading the file...")
with open("myfile.txt", "wb") as f:
f.write(site.read())
else:
print("No download needed, the file is up-to-date.")
الخطوة 6: إغلاق الاتصال
لا تنسَ إغلاق اتصال الموقع بعد الانتهاء من عملك.
site.close()
مثال نهائي للكود
إليك الكود الكامل مع تجميع جميع الخطوات:
import urllib
import os
link = "http://www.someurl.com/myfile.txt"
site = urllib.urlopen(link)
meta = site.info()
file_size = int(meta.getheaders("Content-Length")[0])
print(f"Content-Length: {file_size}")
if os.path.isfile("myfile.txt"):
local_size = os.stat("myfile.txt").st_size
print(f"Local file size: {local_size}")
else:
local_size = 0
if file_size != local_size:
print("Downloading the file...")
with open("myfile.txt", "wb") as f:
f.write(site.read())
else:
print("No download needed, the file is up-to-date.")
site.close()
المشاكل الشائعة: التباس وضع الثنائي
نقطة ملحوظة يجب أخذها في الاعتبار هي أنه عند قراءة وكتابة الملفات، يجب دائمًا فتح تيارات ملفاتك في وضع الثنائي ('rb'
للقراءة و'wb'
للكتابة). هذا يحل عادة فروق الأحجام بسبب تحويلات نهايات الأسطر، خاصة عند تحميل الملفات التي تحتوي على نص. إليك كيفية التأكد من أنك تعمل في وضع الثنائي:
# فتح للكتابة في وضع ثنائي
open(filename, "wb")
# فتح للقراءة في وضع ثنائي
open(filename, "rb")
الخلاصة
في هذا المنشور، استكشفنا كيفية التحقق من حجم الملف على الخادم قبل تحميله في بايثون. هذا مفيد لتحديث الملفات بشكل ذكي ويمنع التحميلات غير الضرورية. مع الخطوات والعينات البرمجية المقدمة، يجب أن تكون مجهزًا جيدًا لتنفيذ هذه الوظيفة في تطبيقات بايثون الخاصة بك.