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

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

इस कसरत की फ़ाइलें " Babynames" नाम में हैं डायरेक्ट्री, google-python-exercises में सेव की जाती है (अगर आपने पहले से ऐसा नहीं किया है, तो google-python-exercises.zip डाउनलोड करें, ज़्यादा जानकारी के लिए सेट अप देखें). Babynames.py में अपना कोड जोड़ें. इन फ़ाइलों में Baby1990.html Baby1992.html ... बिना फ़ाइल वाला एचटीएमएल शामिल होता है. यह एचटीएमएल कोड वैसा ही होता है जैसा आपको ऊपर दी गई सामाजिक सुरक्षा साइट पर आता है. एचटीएमएल पर एक नज़र डालें और इस बारे में सोचें कि इसका इस्तेमाल करके, डेटा को कैसे निकाला जा सकता है.

पार्ट A

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

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

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

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

  • फ़ाइल से पूरा टेक्स्ट निकालें और उसे प्रिंट करें
  • साल को ढूंढकर निकालें और उसे प्रिंट करें
  • नाम और नंबर निकालें और उन्हें प्रिंट करें
  • नाम के डेटा को लिखवाने की सुविधा में बदलें और उसे प्रिंट करें
  • [year, 'name Rank', ... ] लिस्ट बनाएं और उसे प्रिंट करें
  • ExtractNames सूची का इस्तेमाल करने के लिए key() को ठीक करें

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

हर कमांड लाइन आर्ग्युमेंट के लिए, key() कॉल एक्सट्रैक्ट करें_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". इससे एक ही चरण में सभी खास जानकारी जनरेट हो जाती है. (शेल का मानक व्यवहार यह है कि यह "baly*.html" पैटर्न को मेल खाने वाले फ़ाइल नामों की सूची में विस्तृत करता है और फिर शेल Babynames.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>'