Exercício Programa 2: Conta Objetos

Objetivos

  • Continuar a introdução da linguagem Python
  • Aprender a trabalhar com arquivos texto

Descrição

Nesse exercício programa vamos utilizar a função que você implementou no exercício anterior (a função indice()) para construir um programa que conta o número de objetos em um arquivo texto.

Como trabalhar com arquivos texto em Python

O seguinte trecho de código Python salva uma lista de números em um arquivo:

nome = "exemplo_um.txt"
numeros = [123, 456, 7890]
with open(nome, 'w', encoding='utf-8') as arquivo_saida:
    for num in numeros:
        arquivo_saida.write("%d"%num)
        print("Gravei o ", num)

O seguinte trecho de código Python lê do arquivo que foi criado pelo trecho anterior e o imprime:

nome = "exemplo_um.txt"
with open(nome, 'r', encoding='utf-8') as arquivo_entrada:
    texto = arquivo_entrada.read()

    print("Conteúdo do arquivo:")
    print(texto)

    print("\nCaracteres do arquivo: \n")
    for i in texto:
        print(i)

A função open() utilizada nesses dois trechos abrem um arquivo para escrita (indicado por w – do inglês write) ou para leitura (indicado por r – do inglês read). O uso do comando with é recomendado para proteger o uso do arquivo, evitando que o arquivo precise ser “fechado” explicitamente. Para saber mais sobre arquivos em Python, consulte o capítulo Trabalhando com Arquivos do livro Como Pensar Como um Cientista da Computação.

Podemos considerar que o elemento básico em um arquivo texto é um caractere. O argumento “encoding=’utf-8’” utilizado nas chamadas da função open() indica o uso da codificação conhecida por utf-8, que permite a codificação de caracteres acentuados e ideogramas utilizados em línguas diferentes do inglês.

Copie e execute esses trechos de código para ver o resultado. Um problema do primeiro trecho de código é que ele os caracteres que representam os números são gravados todos juntos, sem o uso de um caractere de separação (como espaço, ou vírgula). Isso pode ser notado pelo resultado do segundo trecho de código.

Uma solução simples para corrigir esse problema seria incluir um espaço após gravar (write()) cada número da lista, como mostrado abaixo:

nome = "exemplo_um.txt"
numeros = [123, 456, 7890]
with open(nome, 'w', encoding='utf-8') as arquivo_saida:
    for num in numeros:
        arquivo_saida.write("%d "%num)
        print("Gravei o ", num)

Agora que os números foram “separados”, como agrupar os caracteres do texto para que o texto possa ser reconvertido para números? Tente escrever esse trecho de código antes de prosseguir sua leitura, usando o activecode abaixo:

(pega_numero_tentativa)



Para recuperar os números do arquivo texto, o seguinte trecho de código carrega o arquivo e calcula e imprime a soma dos números:

''' Trecho de código que lê um arquivo texto contendo
    uma sequência de números inteiros separados por espaço.
    O código assume também que há um espaço no final do arquivo,
    como gerado pelo trecho anterior de código.
'''
DIGITOS = '0123456789'
nome = "exemplo_um.txt"
with open(nome, 'r', encoding='utf-8') as arquivo_entrada:
    texto = arquivo_entrada.read()

    num = ''  # string vazio
    soma = 0
    for c in texto:
        if c in DIGITOS:
            num += c   # concatena o novo dígito
        elif len(num) > 0:
            soma += int(num)
            print("Achei o número: ", num, " --> soma parcial: ", soma)
            num = ''

print("Soma total: ", soma)

O que você deve fazer

Escreva um programa em Python que pergunta ao usuário o nome de um arquivo texto e imprime todas as palavras do texto apenas uma vez, indicando também o número de ocorrências de cada palavra.

Exemplos:

Para o texto “ba ba banana” a saída do programa deve ser:

ba: 2
banana: 1

Para o texto:

no meio do caminho
Carlos Drummond de Andrade

no meio do caminho tinha uma pedra
tinha uma pedra no meio do caminho
tinha uma pedra
no meio do caminho tinha uma pedra.

nunca me esquecerei desse acontecimento
na vida de minhas retinas tao fatigadas.
nunca me esquecerei que no meio do caminho
tinha uma pedra
tinha uma pedra no meio do caminho
no meio do caminho tinha uma pedra.

a saída do programa deve ser:

no: 7
meio: 7
do: 7
caminho: 7
Carlos: 1
Drummond: 1
de: 2
Andrade: 1
tinha: 7
uma: 7
pedra: 7
nunca: 2
me: 2
esquecerei: 2
desse: 1
acontecimento: 1
na: 1
vida: 1
minhas: 1
retinas: 1
tao: 1
fatigadas: 1
que: 1