การออกกำลังกายงูหลามชื่อทารก

สำนักงานประกันสังคมมีข้อมูลที่ละเอียดและแบ่งตามปีของชื่อที่ได้รับความนิยมมากที่สุดสำหรับทารกที่เกิดในสหรัฐอเมริกาในปีนั้น (ดู ชื่อทารกในประกันสังคม)

ไฟล์สำหรับการออกกำลังกายนี้อยู่ใน "ชื่อทารก" ภายใน google-python-exercises (ดาวน์โหลด google-python-exercises.zip หากยังไม่ได้ทำ โปรดดูรายละเอียดที่ตั้งค่า) เพิ่มรหัสของคุณใน Babynames.py ไฟล์ Baby1990.html Baby1992.html ... มี html ดิบ คล้ายกับสิ่งที่คุณได้เข้าชมเว็บไซต์ประกันสังคมข้างต้น โปรดดู HTML และคิดว่าคุณจะนำข้อมูลออกไปจาก HTML ได้อย่างไร

ส่วน ก

ในไฟล์ Babynames.py ให้ใช้ฟังก์ชัน filter_names(filename) ซึ่งจะนำชื่อไฟล์ของไฟล์ Baby*.html กลับมา และแสดงข้อมูลจากไฟล์เป็นรายการเดี่ยว โดยใช้สตริงปีที่อยู่ต้นรายการตามด้วยสตริงการจัดอันดับชื่อที่เรียงตามลำดับตัวอักษร ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...] แก้ไข main() ให้เรียกใช้ฟังก์ชัน filter_names() และพิมพ์ผลลัพธ์ (หลักมีโค้ดสำหรับการแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งอยู่แล้ว) หากคุณพบปัญหาในการแก้ไขนิพจน์ทั่วไปสำหรับปีและชื่อแต่ละชื่อ รูปแบบนิพจน์ทั่วไปของโซลูชันจะแสดงที่ส่วนท้ายของเอกสารนี้ โปรดทราบว่า สำหรับการแยกวิเคราะห์หน้าเว็บโดยทั่วไป นิพจน์ทั่วไปจะทำงานได้ไม่ดี แต่หน้าเว็บเหล่านี้มีรูปแบบที่เรียบง่ายและสอดคล้องกัน

เราจะรวมชื่อทั้ง 2 ชื่อไว้ด้วยกัน แทนที่จะแยกชื่อเด็กผู้ชายและเด็กผู้หญิงเข้าด้วยกัน ในบางปี ชื่อจะปรากฏใน HTML มากกว่า 1 ครั้ง แต่เราจะใช้ตัวเลขเพียงตัวเดียวต่อชื่อ ไม่บังคับ: ทำให้อัลกอริทึมชาญฉลาดเกี่ยวกับกรณีนี้ และเลือกจำนวนที่น้อยกว่า

สร้างโปรแกรมเป็นชุดเหตุการณ์สำคัญเล็กๆ น้อยๆ ทำให้แต่ละขั้นตอนทำงาน/พิมพ์บางอย่างก่อนทำขั้นตอนถัดไป นี่คือรูปแบบที่โปรแกรมเมอร์ที่มีประสบการณ์ใช้ ซึ่งควรสร้างชุดไมล์สโตนเพิ่มเติม โดยแต่ละรายการจะมีผลลัพธ์บางอย่างที่จะต้องตรวจสอบ แทนที่จะสร้างทั้งโปรแกรมในขั้นตอนเดียวที่ยิ่งใหญ่

การพิมพ์ข้อมูลที่คุณมีเมื่อสิ้นสุดเป้าหมายหนึ่งจะช่วยให้คุณคิดหาวิธีจัดโครงสร้างข้อมูลนั้นใหม่สำหรับเป้าหมายถัดไป Python เหมาะกับการพัฒนาที่เพิ่มขึ้นในรูปแบบนี้ ตัวอย่างเช่น ก่อนอื่นให้เริ่มจากจุดที่ดึงข้อมูลและพิมพ์ปี แล้วเรียกใช้ sys.exit(0) เหตุการณ์สำคัญที่แนะนำมีดังนี้

  • ดึงข้อความทั้งหมดจากไฟล์ และพิมพ์ออกมา
  • ค้นหาและแยกปีแล้วพิมพ์
  • แยกชื่อและจัดอันดับหมายเลข แล้วพิมพ์
  • รับข้อมูลชื่อลงในคำสั่งแล้วพิมพ์
  • สร้างรายการ [ปี, 'อันดับชื่อ', ... ] และพิมพ์
  • แก้ไข main() เพื่อใช้รายการ ExtractNames

ก่อนหน้านี้เรามีฟังก์ชันอยู่แค่ "พิมพ์" เป็น "มาตรฐาน" การให้ฟังก์ชัน *ส่งคืน* ข้อมูลที่แยกออกมาสามารถนำมาใช้ใหม่ได้มากกว่า ดังนั้นผู้โทรจะมีตัวเลือกในการพิมพ์ข้อมูลนั้นหรือทำอย่างอื่นด้วย (คุณยังสามารถพิมพ์ได้โดยตรงจากภายในฟังก์ชันสำหรับการทดสอบเล็กๆ น้อยๆ ในระหว่างการพัฒนา)

ให้ main() เรียก filter_names() สำหรับอาร์กิวเมนต์บรรทัดคำสั่งแต่ละรายการ และพิมพ์สรุปข้อความ หากต้องการทำให้รายการเป็นข้อความสรุปที่ดูสมเหตุสมผล ตัวอย่างวิธีผนวกอย่างชาญฉลาดมีดังนี้ text = '\n'.join(mylist) + '\n'

ข้อความสรุปควรมีลักษณะดังนี้สำหรับแต่ละไฟล์

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

ส่วน ข

สมมติว่าแทนที่จะพิมพ์ข้อความตามมาตรฐาน เราอยากเขียนไฟล์ที่มีข้อความอยู่ หากมี Flag --summaryfile แล้วให้เขียนไฟล์ใหม่เป็น "foo.html.summary" กับไฟล์อินพุตแต่ละไฟล์ "foo.html" แทนการพิมพ์เป็นเอาต์พุตมาตรฐาน ที่มีข้อความสรุปสำหรับไฟล์นั้น

เมื่อฟีเจอร์ --summaryfile ทำงานได้แล้ว ให้เรียกใช้โปรแกรมกับไฟล์ทั้งหมดโดยใช้ * ดังนี้ "./babynames.py --summaryfile Baby*.html" วิธีนี้จะสร้างสรุปทั้งหมดในขั้นตอนเดียว (ลักษณะการทำงานมาตรฐานของ Shell คือจะขยายรูปแบบ "baby*.html" ไปยังรายการชื่อไฟล์ที่ตรงกัน จากนั้น Shell จะเรียกใช้ Babynames.py และส่งชื่อไฟล์เหล่านั้นทั้งหมดในรายการ sys.argv)

เมื่อข้อมูลจัดระเบียบเป็นไฟล์สรุป คุณจะเห็นรูปแบบเมื่อเวลาผ่านไปด้วยคำสั่ง Shell ดังนี้

$ 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>'