সোশ্যাল সিকিউরিটি অ্যাডমিনিস্ট্রেশনের কাছে সেই বছর মার্কিন যুক্তরাষ্ট্রে জন্ম নেওয়া শিশুদের জন্য কোন নামগুলি সবচেয়ে বেশি জনপ্রিয় তা বছরের ভিত্তিতে এই পরিচ্ছন্ন ডেটা রয়েছে ( সামাজিক সুরক্ষা শিশুর নামগুলি দেখুন)৷
এই অনুশীলনের জন্য ফাইলগুলি google-python-exercises-এর ভিতরে "babynames" ডিরেক্টরিতে রয়েছে (আপনার যদি ইতিমধ্যে না থাকে তবে google-python-exercises.zip ডাউনলোড করুন, বিস্তারিত জানার জন্য সেট আপ দেখুন)। babynames.py-এ আপনার কোড যোগ করুন। বেবি 1990.html baby1992.html ... ফাইলগুলি raw html ধারণ করে, আপনি উপরের সোশ্যাল সিকিউরিটি সাইটটিতে যা পাবেন তার অনুরূপ। এইচটিএমএলটি একবার দেখুন এবং চিন্তা করুন কিভাবে আপনি এটি থেকে ডেটা স্ক্র্যাপ করতে পারেন।
অংশ A
babynames.py ফাইলে, extract_names(filename) ফাংশনটি প্রয়োগ করুন যা একটি baby*.html ফাইলের ফাইলের নাম নেয় এবং ফাইল থেকে ডেটা একটি একক তালিকা হিসাবে ফেরত দেয় -- তালিকার শুরুতে বছরের স্ট্রিং এবং অনুসরণ করে বর্ণানুক্রমিকভাবে নাম-র্যাঙ্ক স্ট্রিং। ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]। main() পরিবর্তন করুন যাতে এটি আপনার extract_names() ফাংশনকে কল করে এবং এটি যা প্রদান করে তা প্রিন্ট করে (প্রধানে ইতিমধ্যেই কমান্ড লাইন আর্গুমেন্ট পার্সিংয়ের জন্য কোড রয়েছে)। আপনি যদি বছরের জন্য নিয়মিত অভিব্যক্তি এবং প্রতিটি নামের কাজ করতে আটকে যান, তাহলে এই নথির শেষে সমাধানের রেগুলার এক্সপ্রেশন প্যাটার্ন দেখানো হয়েছে। মনে রাখবেন যে সাধারণভাবে ওয়েবপৃষ্ঠাগুলি পার্স করার জন্য, রেগুলার এক্সপ্রেশনগুলি ভাল কাজ করে না, তবে এই ওয়েবপৃষ্ঠাগুলির একটি সহজ এবং সামঞ্জস্যপূর্ণ বিন্যাস রয়েছে৷
ছেলে এবং মেয়ের নাম আলাদাভাবে বিবেচনা করার পরিবর্তে, আমরা কেবল তাদের সবাইকে একত্রিত করব। কিছু বছরে, html এ একটি নাম একাধিকবার প্রদর্শিত হয়, কিন্তু আমরা প্রতি নামে একটি সংখ্যা ব্যবহার করব। ঐচ্ছিক: এই ক্ষেত্রে অ্যালগরিদমকে স্মার্ট করুন এবং যেটি সংখ্যাটি ছোট তা বেছে নিন।
প্রোগ্রামটিকে ছোট মাইলস্টোনের একটি সিরিজ হিসাবে তৈরি করুন, পরবর্তী ধাপে চেষ্টা করার আগে প্রতিটি ধাপে কিছু রান/প্রিন্ট করার জন্য পেয়ে যান। এটি অভিজ্ঞ প্রোগ্রামারদের দ্বারা ব্যবহৃত প্যাটার্ন - একটি বিশাল ধাপে পুরো প্রোগ্রামটি তৈরি করার পরিবর্তে, প্রতিটি ক্রমবর্ধমান মাইলস্টোনের একটি সিরিজ তৈরি করুন, যার প্রতিটি পরীক্ষা করার জন্য কিছু আউটপুট রয়েছে।
একটি মাইলফলকের শেষে আপনার কাছে থাকা ডেটা প্রিন্ট করা আপনাকে পরবর্তী মাইলস্টোনের জন্য সেই ডেটাকে কীভাবে পুনর্গঠন করা যায় সে সম্পর্কে চিন্তা করতে সহায়তা করে। পাইথন ক্রমবর্ধমান বিকাশের এই শৈলীর জন্য উপযুক্ত। উদাহরণস্বরূপ, প্রথমে এটিকে সেই স্থানে নিয়ে যান যেখানে এটি বছর বের করে প্রিন্ট করে এবং sys.exit(0) কল করে। এখানে কিছু প্রস্তাবিত মাইলফলক রয়েছে:
- ফাইল থেকে সব লেখা বের করে প্রিন্ট করুন
- বছর খুঁজে বের করুন এবং মুদ্রণ করুন
- নাম এবং র্যাঙ্ক নম্বর বের করে প্রিন্ট করুন
- একটি dict মধ্যে নাম তথ্য পান এবং এটি মুদ্রণ
- [বছর, 'নাম স্থান', ... ] তালিকা তৈরি করুন এবং এটি মুদ্রণ করুন
- ExtractNames তালিকা ব্যবহার করতে main() ঠিক করুন
এর আগে আমাদের ফাংশন ছিল শুধু স্ট্যান্ডার্ড আউট প্রিন্ট. এক্সট্র্যাক্ট করা ডেটা *রিটার্ন* ফাংশনটি থাকা আরও পুনরায় ব্যবহারযোগ্য, তাই কলারের কাছে এটি প্রিন্ট করার বা এটি দিয়ে অন্য কিছু করার পছন্দ রয়েছে। (আপনি এখনও বিকাশের সময় আপনার ছোট পরীক্ষার জন্য আপনার ফাংশনের ভিতর থেকে সরাসরি মুদ্রণ করতে পারেন।)
প্রতিটি কমান্ড লাইন আর্গের জন্য main() extract_names() কল করুন এবং একটি টেক্সট সারাংশ প্রিন্ট করুন। তালিকাটিকে একটি যুক্তিসঙ্গত সংক্ষিপ্ত টেক্সটে পরিণত করার জন্য, এখানে join এর একটি চতুর ব্যবহার রয়েছে: text = '\n'.join(mylist) + '\n'
প্রতিটি ফাইলের জন্য সারাংশের পাঠ্যটি এইরকম হওয়া উচিত:
2006 Aaliyah 91 Aaron 57 Abagail 895 Abbey 695 Abbie 650 ...
খণ্ড খ
ধরুন টেক্সটটিকে স্ট্যান্ডার্ড আউটে প্রিন্ট করার পরিবর্তে, আমরা টেক্সট ধারণকারী ফাইল লিখতে চাই। যদি ফ্ল্যাগ --summaryfile উপস্থিত থাকে, তাহলে নিম্নলিখিতগুলি করুন: প্রতিটি ইনপুট ফাইল 'foo.html'-এর জন্য, স্ট্যান্ডার্ড আউটপুটে প্রিন্ট করার পরিবর্তে, একটি নতুন ফাইল 'foo.html.summary' লিখুন যাতে সেই ফাইলের সারাংশ লেখা থাকে।
--summaryfile বৈশিষ্ট্যটি কাজ করার পরে, এইভাবে * ব্যবহার করে সমস্ত ফাইলে প্রোগ্রামটি চালান: "./babynames.py --summaryfile baby*.html"। এটি এক ধাপে সমস্ত সারাংশ তৈরি করে। (শেলের আদর্শ আচরণ হল যে এটি "baby*.html" প্যাটার্নটিকে মিলিত ফাইলের নামের তালিকায় প্রসারিত করে, এবং তারপর শেল babynames.py চালায়, sys.argv তালিকার সেই সমস্ত ফাইলের নামগুলিকে পাস করে।)
সংক্ষিপ্ত ফাইলগুলিতে সংগঠিত ডেটা সহ, আপনি শেল কমান্ডগুলির সাথে সময়ের সাথে নিদর্শনগুলি দেখতে পারেন, যেমন:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
রেগুলার এক্সপ্রেশন ইঙ্গিত -- বছর: r'Popularity\sin\s(\d\d\d\d)' নাম: r'<td>(\d+)</td><td>(\w+)</td >\<td>(\w+)</td>'