2025, Oct 31 09:02
os.walk के साथ पूरी ट्री पर चलते हुए हर फोल्डर का index.html बनाएँ
स्टैटिक साइट के लिए तरीका: os.walk से पूरी डायरेक्टरी ट्री पर एक पास में हर फोल्डर का index.html जनरेट करें, हार्ड-कोडेड पाथ व FileNotFoundError से छुटकारा.
किसी स्टैटिक साइट की हर डायरेक्टरी के लिए index.html बनाना सुनने में आसान लगता है, लेकिन अक्सर यह हार्ड‑कोडेड पाथ, मैन्युअल रिकर्शन और FileNotFoundError जैसी अनपेक्षित दिक्कतों की गाँठ बन जाता है। अगर आपकी स्क्रिप्ट बार‑बार मौजूदा फ़ोल्डर “खो” देती है या हर डायरेक्टरी में एक index.py रखे बिना आगे नहीं बढ़ती, तो आप फाइल सिस्टम को पार करने के बजाय उससे जूझ रहे हैं। इसका एक साफ‑सुथरा तरीका है।
साधारण तरीके में दिक्कत कहाँ आती है
आम तरीक़ा यह होता है: स्क्रिप्ट को किसी एक फ़ोल्डर पर चलाया, वहाँ index.html लिखा, और फिर सबफ़ोल्डर्स के लिए नई स्क्रिप्टें चलाने की कोशिश की। नतीजा—पाथ हैंडलिंग नाज़ुक हो जाती है और लॉजिक डुप्लिकेट होने लगता है। नीचे उसी पैटर्न का संक्षिप्त रूप है, जो दिखाता है कि पाथ क्यों भटकते हैं और हार्ड‑कोडिंग क्यों करनी पड़ती है।
from pathlib import Path
def build_listing_html(base_loc):
    base_loc = Path(base_loc)
    base_loc = base_loc / 'FOLDER A'
    with open(base_loc / 'index.html', 'w') as fp:
        for entry in sorted(list(base_loc.iterdir())):
            fp.write(f'<a href="{entry.name}">{entry.name}</a>\n')
if __name__ == '__main__':
    build_listing_html('.')
with open("./FOLDER A/SUBFOLDER B/index.py") as fh:
    exec(fh.read())
यह कोड प्रोसेस को एक खास सबडायरेक्टरी में धकेलता है और फिर उससे गहरे फ़ोल्डर के लिए दूसरी स्क्रिप्ट चलाता है। जब सब कुछ प्रोजेक्ट के रूट से चलता है, तो रिलेटिव पाथ अक्सर गलत जगह इशारा करते हैं—जब तक कि आप हर लोकेशन को हाथ से पूरा न लिखें। यहीं से FileNotFoundError पैदा होता है, और इसी वजह से हर डायरेक्टरी में index.py रखने की मजबूरी महसूस होती है।
समस्या का सार
फाइल सिस्टम का ट्रैवर्सल मैन्युअल और बिखरा हुआ है। हर कदम किसी तय वर्किंग डायरेक्टरी पर निर्भर करता है और स्ट्रिंग पाथ्स को स्पष्ट रूप से मानता है। जैसे ही निष्पादन का संदर्भ बदलता है, रिलेटिव रेफरेंस टूट जाते हैं। नतीजा—कई एंट्री पॉइंट्स और हर फ़ोल्डर में डुप्लिकेट स्क्रिप्टें।
सरल उपाय: पूरी ट्री पर एक ही बार चलें और चलते‑चलते इंडेक्स लिखें
डायरेक्टरियों के बीच उछलने या कई स्क्रिप्टें चलाने के बजाय, पूरी डायरेक्टरी ट्री पर एक ही बार इटरेट करें और उसी पास में हर फ़ोल्डर के अंदर index.html बना दें। os.walk() का इस्तेमाल करने से हर इटरेशन में मौजूदा डायरेक्टरी स्पष्ट रहती है और ऐड‑हॉक पाथ सम्हालने की ज़रूरत खत्म हो जाती है। अगर कुछ फ़ाइल नामों को सूची से बाहर रखना हो, तो लिखने से पहले उन्हें फ़िल्टर कर दें। और अगर आपको अधिक समृद्ध HTML चाहिए, तो jinja जैसे टेंप्लेटिंग पैकेज से आउटपुट को स्ट्रक्चर कर सकते हैं—कोर ट्रैवर्सल जैसे का तैसा रहेगा।
import os
def emit_indexes(site_root):
    index_name = "index.html"
    ignore_set = {index_name, "some_other_file.py"}
    link_tpl = '<a href="{filename}">{filename}</a>'
    for dir_here, subdirs, files_here in os.walk(site_root):
        index_path = os.path.join(dir_here, index_name)
        files_here = [x for x in files_here if x not in ignore_set]
        with open(index_path, "w") as outf:
            for fname in files_here:
                outf.write(link_tpl.format(filename=fname) + "\n")
SITE_BASE = "D:/temp/StackOverflow/foo"
emit_indexes(SITE_BASE)
यह तरीका हर मिली डायरेक्टरी में एक index.html लिख देता है। साथ ही आउटपुट फ़ाइल का नाम सूची से बाहर रखकर स्वयं‑लिंकिंग से बचता है, और आप ज़रूरत के मुताबिक और भी आइटम ignore सूची में जोड़ सकते हैं। पूरा प्रोसेस आत्मनिर्भर है; हर फ़ोल्डर में अलग index.py रखने की कोई आवश्यकता नहीं।
यह क्यों मायने रखता है
एक ही ट्रैवर्सल पर भरोसा करने से पाथ से जुड़ी उलझन खत्म होती है और विफलताएँ पूर्वानुमेय बनती हैं। लोकेशन्स को हार्ड‑कोड करने की ज़रूरत नहीं रहती, डुप्लिकेट स्क्रिप्टें घटती हैं, और relative href भी सुसंगत रहते हैं। ट्री बदलते ही यह तरीका स्वाभाविक रूप से स्केल करता है—नए सबफ़ोल्डर्स को बिना किसी अतिरिक्त सेटअप के अपना index.html मिल जाता है।
व्यावहारिक निष्कर्ष
तर्क को फाइल सिस्टम के सहारे चलने दें। ट्री पर एक बार चलें, जिस‑जिस डायरेक्टरी में जाएँ वहाँ का इंडेक्स लिखें, और जिन फ़ाइलों को दिखाना नहीं है उन्हें फ़िल्टर कर दें। अधिक समृद्ध मार्कअप चाहिए तो jinja जैसी टेम्पलेट इंजन जोड़ें। और अगर कुछ फिर भी अटपटा लगे, तो वॉक के दौरान मौजूदा डायरेक्टरी और आउटपुट पाथ प्रिंट करें—ठीक‑ठीक समझ आएगा कि स्क्रिप्ट कहाँ लिख रही है। यह ढांचा बन जाने पर, आप पाथ का माइक्रो‑मैनेजमेंट छोड़ सकते हैं और अपनी स्टैटिक साइट को खुद‑ब‑खुद इंडेक्स होने दें।