"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية البحث بشكل متكرر في المجلدات الفرعية واسترداد الملفات في بايثون؟

كيفية البحث بشكل متكرر في المجلدات الفرعية واسترداد الملفات في بايثون؟

تم النشر بتاريخ 2024-11-16
تصفح:946

How to Recursively Search Sub-Folders and Retrieve Files in Python?

البحث المتكرر في المجلدات الفرعية واسترجاع الملفات

في مجال البرمجة، يمكن أن يكون اجتياز الدلائل واسترداد الملفات مهمة شائعة. أحد الأساليب الفعالة هو استخدام خوارزمية متكررة للبحث في المجلدات الفرعية وتجميع قائمة من الملفات التي تستوفي معايير محددة.

تمت مواجهة مشكلة

واجه المستخدم حاجزًا. أثناء محاولة إنشاء قائمة بملفات محددة في بحث مجلد فرعي متكرر. نشأت المشكلة من قيام متغير المجلد الفرعي بسحب قائمة المجلدات الفرعية بدلاً من المجلد الحالي الذي يحتوي على الملف.

الغرض من المجلد الفرعي

يهدف متغير المجلد الفرعي إلى الاحتفاظ اسم المجلد الفرعي ضمن المجلد الرئيسي حيث يوجد الملف المطلوب.

الحل

يكمن مفتاح حل هذه المشكلة في الاستفادة من "الجذر" أو متغير "dirpath" بدلاً من "subFolder". يحتفظ هذا المتغير بالمسار المطلق إلى الدليل الحالي الذي يتم اجتيازه أثناء العودية. من خلال دمج هذا المسار في إنشاء fileNamePath، يمكن تحقيق الدقة المطلوبة.

import os
result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == '.txt']

تحسين الوحدة النمطية العالمية يتضمن النهج البديل والفعال استخدام وحدة الكرة الأرضية المضمنة في بايثون. تتفوق Glob في اختيار الملفات بناءً على امتداداتها.

استيراد نظام التشغيل من العالم استيراد العالم النتيجة = [y لـ x في os.walk(PATH) لـ y في glob(os.path.join(x[0], '*.txt'))]
import os
from glob import glob
result = [y for x in os.walk(PATH) for y in glob(os.path.join(x[0], '*.txt'))]
وظيفة المولد

من أجل تنفيذ موجز وفعال، يمكن للمرء أيضًا استخدام وظيفة المولد.

من سلسلة استيراد itertools النتيجة = (chain.from_iterable(glob(os.path.join(x[0], '*.txt')) لـ x في os.walk('.')))
import os
from glob import glob
result = [y for x in os.walk(PATH) for y in glob(os.path.join(x[0], '*.txt'))]
بايثون 3.4 الحل

إذا كنت تعمل مع Python 3.4 أو إصدار أحدث، فيمكنك الاستفادة من وظيفة rglob() الخاصة بوحدة pathlib.

من مسار استيراد pathlib result = list(Path(".").rglob("*.[tT][xX][tT]"))
from pathlib import Path
result = list(Path(".").rglob("*.[tT][xX][tT]"))
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3