حل مشكلة مطابقة Regex في ملفات Zip
إذا كان لديك عدد كبير من الملفات النصية المضغوطة في أرشيفات zip، فقد تواجه تحديًا شائعًا: كيفية البحث بكفاءة عن أنماط نصية معينة، مثل أسماء الطرازات، داخل تلك الملفات دون استخراجها أولاً. تصبح هذه العملية مرهقة بشكل خاص عند التعامل مع ملايين الملفات عبر أرشيفات zip متعددة. في هذه التدوينة، سنستكشف كيفية الاستفادة من قدرات بايثون لمعالجة هذه المشكلة باستخدام وحدة zipfile
.
التحدي الماثل أمامنا
قد تجد نفسك في وضعية حيث:
- لديك أكثر من مليون ملف نصي مضغوط في 40 ملف zip.
- لديك قائمة تضم حوالي 500 اسم طراز هواتف وترغب في حساب عدد المرات التي يتم فيها ذكر كل طراز عبر هذه الملفات.
المفتاح هنا هو تنفيذ مطابقة regex على محتوى هذه الملفات دون فك ضغطها، وهو أمر صعب. بينما لا توجد حل جاهز يلبي هذه المتطلبات تمامًا، يمكن أن تساعد الوحدات المدمجة في بايثون في إنشاء حل بسيط وفعال.
الحل باستخدام وحدة Zipfile في بايثون
على الرغم من عدم وجود وحدات تقدم بحث تلقائي باستخدام regex داخل الملفات المضغوطة، يمكنك الاستفادة بسهولة من وحدة zipfile
في بايثون. حيث تتيح لك قراءة محتوى الملفات داخل أرشيف zip وتطبيق أنماط بحث regex عليها.
تنفيذ خطوة بخطوة
-
استيراد الوحدة المطلوبة ابدأ باستيراد وحدة
zipfile
. توفر هذه الوحدة أدوات لقراءة وكتابة ملفات zip مباشرة.import zipfile
-
فتح أرشيف Zip استخدم طريقة
ZipFile
لفتح ملف zip الخاص بك.f = zipfile.ZipFile('myfile.zip')
-
التكرار عبر الملفات الموجودة في الأرشيف قم بالمرور عبر قائمة الملفات المحتواة في أرشيف zip. يمكنك الحصول على أسماء جميع الملفات باستخدام طريقة
namelist()
.for subfile in f.namelist(): print(subfile)
-
قراءة والبحث في محتوى كل ملف لكل ملف، اقرأ محتواه وقم بتقسيمه إلى أسطر. يمكنك بعد ذلك معالجة هذه الأسطر للبحث عن المطابقات باستخدام regex.
data = f.read(subfile) for line in data.split('\n'): print(line) # استبدل هذا السطر بمنطق مطابقة regex الخاص بك
مثال كامل للكود
إليك كيف تتجمع كل هذه الأجزاء في نص برمجي كامل:
#!/usr/bin/python
import zipfile
import re # استيراد وحدة regex لمطابقة الأنماط
# تعريف دالة للبحث عن أسماء الطرازات
def search_models_in_zip(zip_filename, models):
f = zipfile.ZipFile(zip_filename)
occurrences = {model: 0 for model in models}
for subfile in f.namelist():
data = f.read(subfile).decode('utf-8')
for line in data.split('\n'):
for model in models:
if re.search(model, line):
occurrences[model] += 1
return occurrences
# عرف قائمة أسماء الطرازات هنا
model_names = ['model1', 'model2', 'model3'] # أضف أسماء طرازاتك
result = search_models_in_zip('myfile.zip', model_names)
print(result)
الخاتمة
باتباع هذه الطريقة، يمكنك إجراء مطابقة regex بكفاءة على الملفات النصية الموجودة داخل أرشيفات zip باستخدام وحدة zipfile
في بايثون. يوفر هذا النهج لك الوقت ومساحة التخزين، مما يتيح لك التعامل مع مجموعات البيانات الكبيرة بشكل أكثر فعالية. استمتع بقوة بايثون ودعها تبسط مهام معالجة النصوص لديك اليوم!
الآن أنت مستعد للغوص في ملفات zip الخاصة بك وبدء استخراج الرؤى من البيانات الموجودة بداخلها.