बच्चों के नाम Python कसरत

सोशल सिक्योरिटी एडमिनिस्ट्रेशन के पास, साल के हिसाब से यह व्यवस्थित डेटा है कि अमेरिका में उस साल पैदा हुए बच्चों के नाम सबसे ज़्यादा कौनसे हैं. (सामाजिक सुरक्षा से जुड़े बच्चों के नाम देखें).

इस एक्सरसाइज़ की फ़ाइलें google-python-exercises में "babynames" डायरेक्ट्री में मौजूद हैं. अगर आपके पास पहले से google-python-exercises.zip डाउनलोड नहीं है, तो इसे डाउनलोड करें. ज़्यादा जानकारी के लिए, सेट अप करें देखें. Babynames.py में अपना कोड जोड़ें. Baby1990.html Bay1992.html ... फ़ाइलें एचटीएमएल पर एक नज़र डालें और इस बारे में सोचें कि आप इससे डेटा को किस तरह स्क्रेप कर सकते हैं.

पार्ट A

Babynames.py फ़ाइल में, remove_names(filename) फ़ंक्शन लागू करें, जो बेबी*.html फ़ाइल का फ़ाइल नाम लेकर फ़ाइल से डेटा को एक सूची के रूप में दिखाता है -- सूची की शुरुआत में साल की स्ट्रिंग और उसके बाद वर्णमाला के क्रम में नाम रैंक वाली स्ट्रिंग. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. मुख्य() में बदलाव करें, ताकि यह आपकेremove_names() फ़ंक्शन को कॉल कर सके और जो दिखा सके उसे प्रिंट कर सके (मुख्य में, कमांड लाइन आर्ग्युमेंट को पार्स करने के लिए पहले से ही कोड मौजूद है). अगर आप किसी साल और हर नाम के लिए रेगुलर एक्सप्रेशन बनाने में अटक जाते हैं, तो समाधान के रेगुलर एक्सप्रेशन पैटर्न इस दस्तावेज़ के आखिर में दिखाए गए हैं. ध्यान दें कि सामान्य तौर पर वेबपेजों को पार्स करने के लिए, रेगुलर एक्सप्रेशन अच्छा काम नहीं करते, लेकिन इन वेबपेजों का फ़ॉर्मैट सामान्य और एक जैसा होता है.

लड़कों और लड़कियों के नाम अलग-अलग रखने के बजाय, हम उन्हें एक-दूसरे के साथ जोड़ देंगे. कुछ सालों में, कोई नाम एचटीएमएल में एक से ज़्यादा बार दिखता है, लेकिन हम हर नाम के लिए सिर्फ़ एक संख्या का इस्तेमाल करेंगे. ज़रूरी नहीं: इस मामले में एल्गोरिदम को स्मार्ट बनाएं और उससे छोटा नंबर चुनें.

प्रोग्राम को छोटी-छोटी उपलब्धियों की सीरीज़ के तौर पर बनाएं और अगला कदम आज़माने से पहले, कुछ चलाने/प्रिंट करने के हर चरण को पूरा करें. यह एक पैटर्न है जिसे अनुभवी प्रोग्रामर इस्तेमाल करते हैं. - इंंक्रीमेंटल माइलस्टोन की एक ऐसी सीरीज़ तैयार करते हैं जिसमें हर प्रोग्राम की जांच पहले से ही की जाती है, न कि बहुत बड़े पैमाने पर प्रोग्राम को आगे बढ़ाना.

एक माइलस्टोन के आखिर में मौजूद डेटा को प्रिंट करने से आपको यह सोचने में मदद मिलती है कि डेटा को अगले माइलस्टोन के लिए कैसे फिर से तैयार किया जाए. इंक्रीमेंटल डेवलपमेंट की इस शैली के लिए, Python सबसे सही तरीका है. उदाहरण के लिए, सबसे पहले इसे उस जगह पर ले जाएं जहां से साल की जानकारी निकाली जाती है और प्रिंट किया जाता है. साथ ही, sys.exit(0) को कॉल किया जाता है. यहां सुझाई गई कुछ उपलब्धियां दी गई हैं:

  • फ़ाइल से पूरा टेक्स्ट निकालें और उसे प्रिंट करें
  • साल का पता लगाकर उसे प्रिंट करें
  • नाम और रैंक नंबर निकालें और उन्हें प्रिंट करें
  • नामों से जुड़े डेटा को डिक्शनरी में शामिल करें और उसे प्रिंट करें
  • [साल, 'नाम रैंक', ... ] की सूची बनाएं और उसे प्रिंट करें
  • ExtractNames सूची का इस्तेमाल करने के लिए, मुख्य() को ठीक करें

पहले हमारे पास ऐसे फ़ंक्शन थे जो सिर्फ़ प्रिंट के लिए थे. निकाले गए डेटा को फ़ंक्शन *लौटाने* के लिए फ़ंक्शन का ज़्यादा फिर से इस्तेमाल करना, इसलिए कॉल करने वाले के पास इसे प्रिंट करने या इसके साथ कुछ और करने का विकल्प होता है. (डेवलपमेंट के दौरान अपने छोटे-छोटे प्रयोगों के लिए, अब भी सीधे अपने फ़ंक्शन में प्रिंट किया जा सकता है.)

हर कमांड लाइन के आर्ग्युमेंट के लिए,main() कॉल एक्सट्रैक्ट_names() करें और टेक्स्ट की खास जानकारी प्रिंट करें. सूची को सही और खास जानकारी वाले टेक्स्ट में बनाने के लिए, यहां बेहतर तरीके से जॉइन करने का तरीका बताया गया है: text = '\n'.join(mylist) + '\n'

हर फ़ाइल के लिए खास जानकारी वाला टेक्स्ट इस तरह दिखना चाहिए:

2006
Aaliyah 91
Aaron 57
Abagail 895
Abbey 695
Abbie 650
...

पार्ट B

मान लें कि टेक्स्ट को स्टैंडर्ड आउट पर प्रिंट करने के बजाय, हम टेक्स्ट वाली फ़ाइलें लिखना चाहते हैं. अगर फ़्लैग --summaryfile मौजूद है, तो ये काम करें: हर इनपुट फ़ाइल 'foo.html' के लिए, स्टैंडर्ड आउटपुट पर प्रिंट करने के बजाय, एक नई फ़ाइल 'foo.html.summary' में लिखें, जिसमें उस फ़ाइल का खास जानकारी वाला टेक्स्ट शामिल हो.

--summaryfile सुविधा के काम करने के बाद, सभी फ़ाइलों पर प्रोग्राम को इस तरह से चलाएं: "./babynames.py --summaryfile Baby*.html". इससे सारी खास जानकारी एक ही बार में जनरेट हो जाती है. (शेल का स्टैंडर्ड व्यवहार यह है कि यह "baby*.html" पैटर्न को मिलते-जुलते फ़ाइल नामों की सूची में बड़ा करता है. इसके बाद, शेल बेबीnames.py चलाता है और यह sys.orgv सूची में मौजूद सभी फ़ाइल नामों को पास करता है.)

खास जानकारी वाली फ़ाइलों में व्यवस्थित किए गए डेटा को, शेल कमांड की मदद से समय के साथ इस तरह से पैटर्न देखा जा सकता है:

$ grep 'Trinity ' *.summary
$ grep 'Nick ' *.summary
$ grep 'Miguel ' *.summary
$ grep 'Emily ' *.summary

रेगुलर एक्सप्रेशन संकेत -- वर्ष: r'लोकप्रियता\sin\s(\d\d\d\d)' नाम: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'