.. -- coding: utf-8 -- .. Copyright (C) Coelho e Hitoshi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with Invariant Sections being Forward, Prefaces, and Contributor List, no Front-Cover Texts, and no Back-Cover Texts. .. shortname:: EP2 .. description:: exercício conta palavras em arquivos texto 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: .. sourcecode:: python 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: .. sourcecode:: python 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: .. sourcecode:: python 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: .. activecode:: pega_numero_tentativa def main(): ''' teste a sua funcao para separar numeros. Para o string '12 34 567 890' o seu programa deve imprimir 12, 34, 567, e 890 ''' texto = '12 34 567 890' print("Entrada: ", texto) # digite a sua solucao abaixo main() 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: .. sourcecode:: python ''' 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: .. sourcecode:: python ba: 2 banana: 1 Para o texto: .. sourcecode:: python 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: .. sourcecode:: python 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