Bài tập Python tên trẻ em

Cục An sinh xã hội có dữ liệu đơn giản này theo năm về những tên phổ biến nhất đối với những trẻ sinh năm đó ở Hoa Kỳ (xem tên em bé trong an sinh xã hội).

Các tệp của bài tập này nằm trong thư mục "babynames" bên trong google-python-exercises (tải tệp google-python-exercises.zip xuống nếu bạn chưa tải, xem phần Thiết lập để biết thông tin chi tiết). Thêm mã của bạn vào Babynames.py. Các tệp bé1990.html bé1992.html ... chứa html thô, tương tự như những gì bạn nhận được khi truy cập trang web an sinh xã hội ở trên. Hãy xem xét html và suy nghĩ về cách bạn có thể lấy dữ liệu ra khỏi nó.

Phần A

Trong tệp Babynames.py, hãy triển khai hàm extract_names(filename). Hàm này sẽ lấy tên tệp của tệp Baby*.html và trả về dữ liệu từ tệp đó dưới dạng một danh sách duy nhất -- chuỗi năm ở đầu danh sách, theo sau là các chuỗi tên-thứ tự theo thứ tự bảng chữ cái. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Sửa đổi main() để nó gọi hàm extract_names() của bạn và in những gì nó trả về (main đã có mã để phân tích cú pháp đối số dòng lệnh). Nếu bạn gặp khó khăn khi giải các biểu thức chính quy cho năm và tên cho từng tên, thì các mẫu biểu thức chính quy chứa giải pháp sẽ xuất hiện ở cuối tài liệu này. Xin lưu ý rằng đối với việc phân tích cú pháp trang web nói chung, biểu thức chính quy không hoạt động tốt nhưng các trang web này có định dạng đơn giản và nhất quán.

Thay vì xử lý tên bé trai và bé gái riêng, chúng ta sẽ gộp chúng lại với nhau. Trong một số năm, một tên sẽ xuất hiện nhiều lần trong html, nhưng chúng tôi sẽ chỉ sử dụng một số cho mỗi tên. Tùy chọn: thuật toán sẽ thông minh trong trường hợp này và chọn bất kỳ số nào nhỏ hơn.

Xây dựng chương trình dưới dạng một chuỗi các mốc quan trọng nhỏ, hoàn thành từng bước để chạy/in nội dung nào đó trước khi thử bước tiếp theo. Đây là mẫu được các lập trình viên có kinh nghiệm sử dụng – xây dựng một loạt cột mốc tăng dần, mỗi cột mốc có một số kết quả cần kiểm tra, thay vì xây dựng toàn bộ chương trình trong một bước lớn.

In dữ liệu bạn có ở cuối một mốc quan trọng sẽ giúp bạn suy nghĩ cách sắp xếp lại cấu trúc dữ liệu đó cho mốc tiếp theo. Python rất phù hợp với phong cách phát triển dần dần này. Ví dụ: trước tiên, hãy lấy nó đến điểm mà nó trích xuất và in năm rồi gọi sys.exit(0). Dưới đây là một số mốc quan trọng được đề xuất:

  • Trích xuất tất cả văn bản từ tệp và in
  • Tìm và trích xuất năm rồi in ra
  • Trích xuất tên, số thứ hạng và in ra
  • Lấy dữ liệu tên thành một bản chính tả và in ra
  • Tạo danh sách [năm, 'thứ hạng tên', ... ] và in danh sách đó
  • Sửa lỗi main() để sử dụng danh sách ExtractNames

Trước đó, chúng ta đã có các hàm chỉ cần in để chuẩn hoá. Đối tượng có thể sử dụng lại hàm *trả về* dữ liệu đã trích xuất, nhờ đó phương thức gọi có lựa chọn in hoặc làm việc khác với dữ liệu đó. (Bạn vẫn có thể in trực tiếp từ bên trong hàm cho các thử nghiệm nhỏ trong quá trình phát triển.)

Yêu cầu main() gọi extract_names() cho mỗi đối số dòng lệnh và in bản tóm tắt văn bản. Để chuyển danh sách thành một văn bản tóm tắt có hình thức hợp lý, hãy sử dụng phép kết hợp khéo léo: text = '\n'.join(mylist) + '\n'

Văn bản tóm tắt cho mỗi tệp sẽ có dạng như sau:

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

Phần B

Giả sử thay vì in văn bản để chuẩn, chúng ta muốn ghi các tệp chứa văn bản. Nếu cờ --summaryfile" xuất hiện, hãy làm như sau: đối với mỗi tệp đầu vào "foo.html", thay vì in ra đầu ra tiêu chuẩn, hãy viết một tệp mới "foo.html.summary" chứa văn bản tóm tắt cho tệp đó.

Khi tính năng --summaryfile file hoạt động, hãy chạy chương trình trên tất cả các tệp bằng cách sử dụng * như sau: "./babynames.py --summaryfile Baby*.html". Thao tác này sẽ tạo tất cả các bản tóm tắt trong một bước. (Hành vi tiêu chuẩn của shell là mở rộng mẫu "baby*.html" thành danh sách tên tệp phù hợp, sau đó shell chạy bénames.py, chuyển tất cả các tên tệp đó trong danh sách sys.argv.)

Khi dữ liệu được sắp xếp thành các tệp tóm tắt, bạn có thể xem các mẫu theo thời gian bằng các lệnh shell, như sau:

$ grep 'Trinity ' *.summary
$ grep 'Nick ' *.summary
$ grep 'Miguel ' *.summary
$ grep 'Emily ' *.summary

Gợi ý biểu thức chính quy -- năm: r'Mức độ phổ biến\sin\s(\d\d\d\d)' tên: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'