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

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

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

ส่วน ก

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

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

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

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

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

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

มี main() การแยก_names() สำหรับอาร์กิวเมนต์บรรทัดคำสั่งแต่ละรายการ และพิมพ์สรุปข้อความ หากต้องการทำให้รายการเป็นข้อความสรุปที่ดูสมเหตุสมผล ให้ใช้วิธีผนวกที่ชาญฉลาด 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" วิธีนี้จะสร้างข้อมูลสรุปทั้งหมดในขั้นตอนเดียว (ลักษณะการทำงานมาตรฐานของ 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>'