تمتلك إدارة الضمان الاجتماعي هذه البيانات المرتبة حسب السنة بالأسماء الأكثر شعبية للأطفال المولودين في ذلك العام في الولايات المتحدة الأمريكية (انظر أسماء الأطفال بعد الضمان الاجتماعي).
ملفات هذا التمرين موجودة في "babynames" (أسماء الأطفال) الدليل داخل google-python-exercises (نزِّل google-python-exercises.zip إذا لم يسبق لك إجراء ذلك، راجِع الإعداد للحصول على التفاصيل). أضِف الرمز في Babynames.py. الملفات Baby1990.html Baby1992.html ... تحتوي على html خام، على نحو يشبه ما تحصل عليه عند زيارة موقع الضمان الاجتماعي أعلاه. ألق نظرة على html وفكر في كيفية استخراج البيانات منها.
الجزء (أ)
في الملف Babynames.py، نفذ الدالة clean_names(filename) التي تأخذ اسم ملف child*.html وترجع البيانات من الملف كقائمة واحدة -- سلسلة السنة في بداية القائمة متبوعة بسلاسل ترتيب الاسم بترتيب أبجدي. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. قم بتعديل ()main ()رئيسي/لاستدعاء الدالة clean_names() وطباعة ما تقوم بإرجاعه (تحتوي الطريقة الرئيسية بالفعل على رمز تحليل وسيطة سطر الأوامر). إذا واجهتك مشكلة في استخدام التعبيرات العادية للسنة وكل اسم، تظهر أنماط التعبير العادي للحل في نهاية هذا المستند. يُرجى ملاحظة أنه لتحليل صفحات الويب بشكل عام، لا تكون التعبيرات العادية جيدة، ولكن تنسيق صفحات الويب هذه بسيط ومتسق.
بدلاً من التعامل مع أسماء الأولاد والبنات بشكل منفصل، سنجمعهما معًا. في بعض السنوات، يظهر الاسم أكثر من مرة في html، ولكننا سنستخدم رقمًا واحدًا فقط لكل اسم. اختياري: اجعل الخوارزمية ذكية بشأن هذه الحالة واختر أي رقم أصغر.
أنشئ البرنامج كسلسلة من المعالم الرئيسية الصغيرة، مع الحصول على كل خطوة لتشغيل/طباعة شيء ما قبل تجربة الخطوة التالية. وهذا هو النمط الذي يستخدمه المبرمجون ذوو الخبرة، فأنشئ سلسلة من المعالم الرئيسية التدريجية، مع وجود بعض المخرجات للتحقق منها، بدلاً من إنشاء البرنامج بأكمله في خطوة كبيرة واحدة.
تساعدك طباعة البيانات التي لديك في نهاية معلم رئيسي واحد على التفكير في كيفية إعادة هيكلة تلك البيانات للمعلم الرئيسي التالي. تتلاءم لغة بايثون جيدًا مع هذا النمط من التطوير التدريجي. على سبيل المثال، قم أولاً بالوصول إلى النقطة التي تقوم فيها باستخراج السنة وطباعتها واستدعاء sys.exit(0). فيما يلي بعض المعالم الرئيسية المقترحة:
- استخرِج النص بكامله من الملف واطبعه
- ابحث عن السنة واستخرِجها واطبعها
- استخراج الأسماء وترتيب الأرقام وطباعتها
- الحصول على بيانات الأسماء في قاموس وطباعته
- أنشِئ قائمة [year, 'name Rank', ... ] واطبعها
- إصلاح الوظيفة الرئيسية() لاستخدام قائمة استخراجات الأسماء
في وقت سابق كان لدينا دوال للطباعة فقط إلى إخراج قياسي. من الأسهل إعادة استخدام الدالة *إرجاع* البيانات المستخرجة، بحيث يكون لدى المتصل خيار طباعتها أو تنفيذ شيء آخر بها. (لا يزال بإمكانك الطباعة مباشرة من داخل الدوال لتجاربك الصغيرة أثناء التطوير).
احصل على استدعاء main() لاستخراج الاستخراج_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'مدى الرواج\sin\s(\d\d\d\d)' الأسماء: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'