아기 이름 Python 운동

사회보장국에서는 해당 해에 미국에서 태어난 아기에게 가장 인기 있는 이름을 연도별로 정리한 이 깔끔한 데이터를 보유하고 있습니다 (사회보장 아기 이름 참조).

이 연습용 파일은 google-python-exercises 내의 'babynames' 디렉터리에 있습니다. 아직 google-python-exercises.zip을 다운로드합니다. 자세한 내용은 설정을 참조하세요. emptynames.py에 코드를 추가합니다. Bay1990.html empty1992.html ... 파일에는 위의 사회보장 사이트 방문 시 표시되는 것과 유사한 원본 HTML이 포함되어 있습니다. html을 살펴보고 데이터에서 데이터를 추출하는 방법에 대해 생각해 보세요.

파트 A

emptynames.py 파일에서 empty*.html 파일의 파일 이름을 가져와서 파일의 데이터를 단일 목록으로 반환하는 extract_names(filename) 함수를 구현합니다. 이 함수는 목록 시작 부분의 연도 문자열 다음에 알파벳순으로 이름-순위 문자열이 나오는 단일 목록으로 반환합니다. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. main()을 수정하여 extract_names() 함수를 호출하고 반환되는 결과를 출력합니다. main()에는 명령줄 인수 파싱을 위한 코드가 이미 있습니다. 연도와 각 이름에 대한 정규 표현식을 찾는 데 어려움을 겪는 경우 이 문서의 마지막에 솔루션 정규 표현식 패턴이 표시됩니다. 일반적으로 웹페이지를 파싱하는 경우 정규 표현식은 유용하지 않지만 이러한 웹페이지는 간단하고 일관된 형식을 사용합니다.

남자 아이와 여자 아이 이름을 따로 부르는 대신 이 두 가지를 한꺼번에 섞어 보겠습니다. 이름이 HTML에 두 번 이상 표시되는 경우도 있지만 이름당 하나의 숫자만 사용됩니다. 선택사항: 이 경우에 대해 알고리즘을 스마트하게 만들고 더 작은 숫자를 선택합니다.

일련의 작은 마일스톤으로 프로그램을 빌드하고, 다음 단계를 시도하기 전에 각 단계에서 무언가를 실행하거나 인쇄하도록 합니다. 이는 숙련된 프로그래머들이 사용하는 패턴입니다. 한 번에 전체 프로그램을 빌드하는 대신, 각각의 결과를 확인할 수 있는 일련의 증분 마일스톤을 빌드하세요.

하나의 마일스톤이 끝날 때 가지고 있는 데이터를 출력하면 다음 마일스톤을 위해 데이터를 재구성하는 방법을 생각할 수 있습니다. Python은 이러한 스타일의 증분 개발에 적합합니다. 예를 들어 먼저 연도를 추출하여 출력하고 sys.exit(0)를 호출하는 지점으로 가져옵니다. 다음은 몇 가지 추천 주요 시점입니다.

  • 파일에서 모든 텍스트를 추출하여 출력합니다.
  • 연도를 찾아서 추출하여 출력합니다
  • 이름을 추출하여 번호를 매기고 출력합니다.
  • 이름 데이터를 dict로 가져와 출력
  • [year, 'name rank', ... ] 목록 작성 및 출력
  • ExtractNames 목록을 사용하도록 main()을 수정합니다.

이전에는 함수를 표준 출력으로 출력했습니다. 추출된 데이터를 *반환* 하는 함수가 있으면 호출자가 해당 데이터를 출력할지, 아니면 다른 작업을 할지 선택할 수 있습니다. (개발 중에 소규모 실험을 위해 함수 내에서 직접 인쇄할 수 있습니다.)

각 명령줄 인수에 대해 main()이 extract_names()를 호출하고 텍스트 요약을 출력하도록 합니다. 목록을 합리적인 디자인의 요약 텍스트로 만들기 위해 조인을 현명하게 사용해 보겠습니다. text = '\n'.join(mylist) + '\n'

각 파일의 요약 텍스트는 다음과 같이 표시됩니다.

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

파트 B

텍스트를 표준 출력으로 출력하는 대신 텍스트가 포함된 파일을 작성한다고 가정해 보겠습니다. 플래그 --summaryfile이 있는 경우 입력 파일 'foo.html'에 대해 표준 출력으로 출력하는 대신 해당 파일의 요약 텍스트를 포함하는 새 파일 'foo.html.summary'를 작성합니다.

--summaryfile 기능이 작동하면 "./babynames.py --summaryfile empty*.html"과 같이 *를 사용해 모든 파일에서 프로그램을 실행합니다. 이렇게 하면 한 번에 모든 요약이 생성됩니다. 셸의 일반적인 동작은 'baby*.html' 패턴을 일치하는 파일 이름 목록으로 확장한 다음 셸이 emptynames.py를 실행하여 sys.argv 목록에 이러한 모든 파일 이름을 전달하는 것입니다.

요약 파일로 정리된 데이터를 통해 다음과 같은 셸 명령어를 통해 시간 경과에 따른 패턴을 확인할 수 있습니다.

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

정규 표현식 힌트 -- 연도: r'인기\sin\s(\d\d\d\d)' names: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'