Exercício de Python para nomes de bebês

A administração da Previdência Social tem esses dados organizados por ano de quais nomes são mais populares para bebês nascidos naquele ano nos EUA (consulte nomes de bebês da Previdência Social).

Os arquivos deste exercício estão no diretório "babynames" em google-python-exercises. Faça o download de google-python-exercises.zip se ainda não tiver feito isso. Veja mais detalhes em Configuração. Adicione seu código em babynames.py. Os arquivos baby1990.html baby1992.html ... contêm html bruto, semelhante ao que você vê ao visitar o site de previdência social acima. Olhe para o html e pense em como você pode copiar os dados dele.

Parte A

No arquivo babynames.py, implemente a função extract_names(filename) que usa o nome de um arquivo baby*.html e retorna os dados do arquivo como uma lista única -- a string do ano no início da lista seguida das strings da classificação do nome em ordem alfabética. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Modifique main() para que chame sua função extract_names() e imprima o que retorna (o principal já tem o código para a análise do argumento de linha de comando). Se você tiver dificuldade para trabalhar com as expressões regulares para o ano e cada nome, os padrões de expressões regulares da solução são mostrados no final deste documento. Para analisar páginas da Web em geral, as expressões regulares não funcionam muito bem, mas essas páginas têm um formato simples e consistente.

Em vez de tratar os nomes masculinos e femininos separadamente, vamos juntá-los. Em alguns anos, um nome aparece mais de uma vez no html, mas usaremos apenas um número por nome. Opcional: deixe o algoritmo mais inteligente sobre este caso e escolha o número menor.

Crie o programa como uma série de pequenos marcos, executando cada etapa para executar ou imprimir algo antes de tentar a próxima etapa. Esse é o padrão usado por programadores experientes: construir uma série de marcos incrementais, cada um com alguma saída a ser verificada, em vez de construir todo o programa em uma grande etapa.

Imprimir os dados que você tem no final de um marco ajuda a pensar em como reestruturar esses dados para o próximo marco. O Python é adequado para esse estilo de desenvolvimento incremental. Por exemplo, primeiro a chega ao ponto em que ele extrai e exibe o ano e chama sys.exit(0). Veja alguns marcos sugeridos:

  • Extrair todo o texto do arquivo e imprimi-lo
  • Encontre e extraia o ano e imprima-o
  • Extraia os nomes, classifique números e imprima-os
  • Extrair os dados de nomes em um dict e imprimi-lo
  • Construa a lista [ano, 'nome da classificação', ... ] e imprima-a
  • Correção de main() para usar a lista ExtractNames.

Anteriormente, as funções eram apenas impressas na saída padrão. É mais reutilizável fazer com que a função *retorne* os dados extraídos para que o autor da chamada tenha a opção de mostrá-los ou fazer outra coisa com eles. Você ainda pode imprimir diretamente de dentro de suas funções para seus pequenos experimentos durante o desenvolvimento.

Faça com que main() chame extract_names() para cada argumento de linha de comando e imprima um resumo de texto. Para transformar a lista em um texto de resumo razoável, aqui está um uso inteligente de JOIN: text = '\n'.join(mylist) + '\n'

O texto de resumo deve ficar assim para cada arquivo:

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

Parte B

Imagine que, em vez de exibir o texto de acordo com os padrões, queremos criar arquivos que contenham o texto. Se a sinalização --summaryfile estiver presente, faça o seguinte: para cada arquivo de entrada "foo.html", em vez de imprimir na saída padrão, grave um novo arquivo "foo.html.summary" que contenha o texto de resumo desse arquivo.

Assim que o recurso --summaryfile estiver funcionando, execute o programa em todos os arquivos usando * desta forma: "./babynames.py --summaryfile baby*.html". Isso gera todos os resumos em uma única etapa. O comportamento padrão do shell é expandir o padrão "baby*.html" para a lista de nomes de arquivos correspondentes e, em seguida, executar babynames.py, passando todos esses nomes de arquivo na lista sys.argv.

Com os dados organizados em arquivos de resumo, é possível ver padrões ao longo do tempo com comandos do shell, como este:

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

Dicas de expressão regular -- year: r'Popularity\sin\s(\d\d\d\d)' names: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'