Arquivos
Teoria
Fala aí, cara! É provável que todos os programas que você escreveu até aqui não utilizava nenhum dado externo. Mas, pode ser útil ler os dados de um arquivo de texto, em vez de perguntar tudo pro usuário com a função input(). Por exemplo, se você tiver um arquivo de texto com as notas de todos os alunos de uma turma e quiser calcular suas médias, pode fazer um programa que lê esse arquivo pra obter esses dados, sacou?
Abrindo arquivos
Se liga! Pra abrir um arquivo, a gente usa a função open(). Passamos como parâmetro o nome do arquivo que a gente quer ler e a letra “r” entre aspas, respectivamente. O arquivo que foi aberto ficou salvo na variável “arquivo”.
O arquivo deve estar na mesma pasta que o programa que você tá escrevendo em Python. Além disso, não pode esquecer de colocar a extensão do arquivo. Nesse caso, arquivos de texto tem extensão “.txt”, então a gente geralmente vai colocar o nome do arquivo com o “.txt” no final.
Além disso, a gente coloca aquele “r” no segundo parâmetro pra indicar que a gente só quer ler esse arquivo. Abrindo o arquivo assim a gente só consegue ler, mas não consegue escrever, ok?! No próximo tópico a gente vai falar sobre como escrever arquivos, mas por enquanto vamos só ler, ok?!
Por último, repara que eu fiz um arquivo.close() ali. Essa linha é obrigatória. Se você abriu um arquivo, você PRECISA fechar ele antes de finalizar o seu programa! Essa linha deve ficar no fim do código que você abriu o arquivo. A dica é, assim que você abrir um arquivo, já escreve logo o comando pra fechar. Assim você não esquece dele. Aí depois você escreve todo seu programa entre essas duas linhas.
Função read()
Quando o arquivo é aberto e colocado numa variável, ele não está em formato de texto. A função read() é capaz de ler todo o arquivo e transformar numa string.
Dessa forma, todo o texto presente no arquivo vai ser armazenado na variável em_texto. Mas também é possível ler uma linha de cada vez.
Função readline()
A função readline() lê uma linha do arquivo (a primeira), e salva numa variável.
Talvez você esteja se perguntando como ler as outras linhas do arquivo, e é aí que entra os cuidados que você tem que tomar quando estiver usando arquivos… Só dá pra ler o arquivo uma vez, ok? Se você usar a função read() num arquivo, ela não vai funcionar de novo. Se você usar a readline(), na segunda vez a o resultado vai ser a segunda linha, e assim por diante.
Viu? Repara que com o mesmo código, os resultados vão ser diferentes, e não dá pra ler duas vezes a mesma linha. Tenta lembrar que não é possível ler o mesmo dado duas vezes no arquivo! O que você já leu uma vez, já era! Tem que deixar tudo salvo.
Iterando pelo arquivo
Agora que tu já tá ligado em como fazer as operações de leitura manualmente, vou te mostrar que dá pra ler o arquivo inteiro, uma linha por vez, usando a estrutura for.
Esse código exibe todas as linhas do arquivo. Isso porque o for vai repetir o código que estiver dentro do seu escopo pra todas as linhas do arquivo, ok?!
Escrevendo arquivo
Pra escrever um arquivo, você precisa trocar o “r” por “w”.
Dessa forma, caso o arquivo não exista, será criado um novo. Mas caso já exista, será sobrescrito, jae?!
Depois que você abrir um arquivo com permissões de escrita, pode usar a função write() pra escrever nele.
Mas tu lembra do \n? O “\n” é como apertar enter no teclado, ele pula uma linha. Se você for escrevendo no arquivo, vai ficar tudo um do lado do outro. Pra pular linha, você não pode esquecer de colocar o \n no final, beleza?!
Não esquece de fechar o arquivoooooo
Cara! Eu juro que não chamar a função close() no final é um problemão! Pra você ficar craque em resolver problemas com arquivos, vamos pros exercícios de fixação. Lá, os exemplos com arquivos prontos vão facilitar muito o teu entendimento. Tô te esperando lá!
Função read()
Função readline()
Iterando pelo arquivo
Escrevendo arquivo
Não esquece de fechar o arquivoooooo
Exercícios Resolvidos
Exercício Resolvido #1
PUC-Rio, INF1025.
Ler arquivo cujo nome é indicado na entrada e exibir as suas 10 primeiras linhas.
Passo 1
Opa! Aqui a gente precisa abrir um arquivo e exibir as 10 primeiras linhas… Mas esse arquivo é arbitrário, blz? É um programa que serve pra qualquer arquivo, e por isso a gente precisa perguntar o nome do arquivo que é pra gente abrir no início do programa! E, pra perguntar, a gente usa a função input().
Então vamos começar por aí! Vou criar uma variável e guardar dentro dela o nome do arquivo que a gente vai ler...
E pronto! Agora que temos o nome, a gente só precisa abrir esse arquivo.
Passo 2
Pra abrir o arquivo, vamos usar a função open(). No primeiro parâmetro a gente vai indicar o nome do arquivo e no segundo, o tipo de operação de abertura que a gente quer… Como a gente quer só ler, vamos usar a operação “r” (de read, que significa “ler” em inglês). Se liga só:
Aí, show! A partir daqui, o arquivo tá aberto e salvo na variável arq, e a gente já pode começar a ler seu conteúdo. Pra ler uma linha, a gente poderia usar a função readline(), que já vem por padrão nas variáveis que armazenam arquivos. Tipo assim:
E assim esse programa vai ler a primeira linha do arquivo… Vamos executar esse programa pra ver como fica o resultado! Mas, cara, pra gente testar, a gente precisa de um arquivo pra ler, certo? Então vamos criar um!
Passo 3
Pra criar um arquivo de testes, vamos abrir o bloco de notas do PC e escrever alguma coisa. Mas lembre-se que essa coisa tem que ter mais de 10 linhas, afinal queremos ler as primeiras 10. Pra testar, eu copiei a letra do hino nacional e colei no bloco de notas...
Aí beleza, vamos salvar esse arquivo NA MESMA PASTA que você criou seu arquivo .py pra escrever o programa. Pra salvar no bloco de notas, usa Ctrl+S.
Agora que os arquivos estão na mesma pasta, bora executar o programa e testar.
Passo 4
Apertei pra executar o programa aqui e digitei o nome do arquivo, não esquecendo que os arquivos salvos pelo bloco de notas tem o final “.txt”. Aí fica assim:
Bom, por enquanto só exibiu uma linha, até porque foi o que a gente mandou fazer no código!
Mas eu queria enfatizar que ali em baixo do que a gente exibiu ficou uma linha vazia. E isso acontece porque, no fim da linha do arquivo no bloco de notas, a gente apertou enter pra pular de linha… Esse enter (que é um \n em Python) vem junto quando a gente usa a função arq.readline(), mas a gente não quer ela… E pra tirar ela, a gente pode usar o método de string .strip(). Assim:
Pronto! Agora, a gente pode testar de novo…
Dessa forma, o “\n” não vem junto, viu?! Show! Agora, em vez de exibir só uma linha, vamos modificar nosso programa pra exibir 10.
Parte 4
Pra exibir 10 vezes, só precisamos repetir o código do print() 10 vezes… A gente podia copiar e colar a linha 10 vezes e funcionaria, mas seu professor não vai gostar disso não!
Então, bora usar uma estrutura de repetição pra isso… Bora usar o for com range():
A gente criou uma variável i que não tá sendo usada pra nada, mas a gente precisa criar uma pra fazer o laço for. E o 10 dentro do range tá dizendo a quantidade de vezes que a gente quer que o código se repita!
Vamos executar esse programa pra ver o que acontece…
Ala! As 10 primeiras linhas foram exibidas! Mas talvez você esteja #EMCHOQUE, porque a gente repetiu o mesmo código e o programa leu diferentes linhas…
Mas isso aconteceu porque só é possível ler as informações do arquivo UMA VEZ. Com isso, a função readline() lê a primeira linha. E a cada vez que a gente chama ela, a primeira linha é “deletada” da variável que abrimos o arquivo, sacou?
Então, depois de ler a primeira linha, a segunda linha passa a ser a primeira linha! E por isso, podemos ler a segunda linha usando readline() de novo! E agora finalizamos o exercício, certo?!
Na verdade, a gente ainda precisa fechar o arquivo...
Passo 4
Cara, quando a gente abre um arquivo com a função open(), a gente precisa fechar esse arquivo antes do programa acabar… Não podemos esquecer esse passo, ok?! Na verdade, quando usamos a operação só de leitura, não faz muita diferença na prática.
Mas o seu professor vai descontar ponto se você não fechar o arquivo! E como a gente não gosta de perder ponto, bora chamar o método close() na última linha ali…
Mas repara bem que a gente fechou o arquivo FORA do laço de repetição, ok? Isso porque a gente só tem que fechar uma vez, depois de fazer todas as leituras… E, com isso, agora sim terminamos o exercício!
Valeuuu!
Resposta
Exercício Resolvido #2
PUC-Rio, INF1025.
Concatenar os arquivos indicados na entrada, gerando um novo arquivo resultante da concatenação. A entrada de dados contendo os nomes dos arquivos a serem concatenados termina com nome=’fim’.
Passo 1
Ihhh! Esse enunciado tá meio confuso. Mas até que o que a gente precisa fazer é de boa, a gente precisa abrir vários arquivos de nomes que forem digitados pelo usuário e, no fim, criar um novo arquivo como sendo a união desses arquivos! O professor podia ter dado uns exemplos, né?!
Mas enfim, bora resolver! Primeiramente, a gente precisa receber os nomes dos arquivos até o cara digitar “fim”. Então, vamos fazer assim: criar uma lista de arquivos, e a cada nome digitado a gente abre um arquivo e salva nessa lista. Repara que a gente só quer ler esses arquivos, então a gente só precisa pedir permissão de leitura (“r”).
Criamos um laço de repetição while(True). Assim, esse código é executado pra sempre (muito tempo). Porém, a gente precisa checar se o nome digitado é fim, e caso seja, a gente sai do loop. Pra sair do loop, a gente usa o comando break. Se liga só:
E pronto! Agora, quando o cara digitar “fim”, o loop vai ser quebrado e o programa vai continuar, com os arquivos abertos e salvos dentro da lista “arquivos”...
Agora, vamos criar o arquivo que a gente vai salvar a concatenação.
Passo 2
Pra isso, vamos abrir mais um arquivo, mas esse a gente vai abrir com permissão de escrita só. Que tal salvar numa variável chamada “arq_final”?
Aí, show! A partir daqui, o arquivo final tá criado, aberto e salvo na variável “arq_final”. Agora, a gente precisa escrever o conteúdo dos outros arquivos dentro desse! Pra isso, a gente pode criar um loop, onde pra cara arquivo, a gente escreve o conteúdo desse arquivo no “arq_final”.
E vamos lembrar de algumas funções interessantes que vão nos ajudar nisso: o método .read() que lê um arquivo TODO de uma vez, e o método .write(), que escreve em um arquivo… Dá pra usar essas funções assim:
Mas esse código tem um problema… Porque se o conteúdo de um arquivo não terminar com um “\n”, então a última linha de um arquivo vai embolar com a primeira linha de outro.
Então, bora pular uma linha no final de cada arquivo! Pra isso, a gente pode concatenar no final do conteúdo de cada arquivo um “\n”! Tipo assim, olha:
Agora sim! As linhas não vão mais ficar emboladas… Mas a gente ainda não acabou, ok?! PRECISAMOS fechar os arquivos que abrimos antes do programa terminar. Até porque, como pedimos permissão de escrita, o código nem vai funcionar se a gente não fechar os arquivos.
Passo 3
Bom, a gente tá lendo os arquivos inteiros de uma vez usando o método read(). E, pô, depois que a gente lê o arquivo todo e escreve no arquivo final, a gente não precisa mais dele, né?! Por isso, vamos aproveitar o nosso laço de repetição e, depois de escrever no novo arquivo, já podemos fechar o arquivo recém lido! Se liga só:
Show! Só que ainda falta a gente fechar o arquivo final, e esse vai ser usado em todos os loops. Por isso, a gente precisa fechar ele DEPOIS do fim do laço de repetição. Então, bora fechar:
E pronto! Depois disso, um arquivo chamado “final.txt” vai aparecer na pasta do programa com o resultado… Mas, pra deixar tudo mais bonitinho, vamos exibir uma mensagem no fim dizendo isso.
Agora sim!
Mas antes de entregar essa resolução, é uma boa ideia a gente testar! Vem comigo...
Passo 4
Pra testar, eu vou abrir o bloco de notas 3 vezes e criar 3 arquivos com conteúdos aleatórios pra teste. Eu salvei os arquivos que criei na mesma pasta do arquivo do .py programa. Olha como ficou:
Com esses arquivos de teste, vamos executar e ver o que acontece!
Vamos dar mais uma olhada lá na pasta…
Olha lá! O arquivo final.txt realmente apareceu ali. Bora abrir ele pra ver se tá tudo certo?
hihihihi! Parece que tudo funcionou como o esperado!
Obs: eu só não mostrei o conteúdo dos arquivos separados pra não tomar muito espaço aqui, mas esse resultado foi certinho a união de todos eles. E, com isso, finalizamos o exercício!
Te vejo no próximo, jae?! Valeuuuu
Resposta
Ei, a resposta está no passo a passo :)
Exercício Resolvido #3
PUC-Rio, INF1025 - Adaptado.
Ler um arquivo e exibir a quantidade de palavras presentes no arquivo indicado pelo usuário.
Passo 1
Fala aí! Nessa questão, vamos abrir um arquivo e contar quantas palavras tem dentro dele. Depois, a gente já pode fechar esse arquivo. A gente não pode esquecer de fechar, hein...
Então, bora resolver! Vamos começar perguntando pro usuário qual o nome do arquivo que a gente precisa ler. Pra isso, vamos usar a função input().
Aí, quando a gente já tiver o nome, a gente pode abrir o arquivo. Mas se liga, como a gente vai só abrir pra ler e não vai mexer em nada, então a gente pode pedir só permissão de leitura (“r”).
Tipo assim, viu?! Aí agora a gente já tem o arquivo aberto e salvo na variável arq. Vamos contar as palavras!
Passo 2
Cara, existem várias formas de fazer isso (assim como todas as resoluções de prog). Mas eu vou escolher fazer uma iteração por todas as linhas do arquivo. Sabia que a gente pode fazer isso com o laço for?
Se a gente somar a quantidade de palavras que tem em cada linha, no fim a gente vai ter a quantidade total, né? Bora declarar uma variável FORA do for pra gente armazenar esse conteúdo então…
Antes de começar a contar, temos 0 palavras. A cada palavra encontrada a gente soma 1 nessa variável! Mas, você tem alguma ideia de como contar as palavras de uma linha?!
Relaxa, eu tenho uma! Vem comigo.
Passo 3
Pra gente entender a ideia, bora olhar pra essa frase aqui:
Essa frase tem 4 palavras… E tem 3 espaços! Vamos olhar uma outra frase:
4 palavras também… E olha, 3 espaços. Será que é assim sempre???
Vamos testar mais uma:
Tem 10 e palavras e… 9 espaços! Cara, parece que a quantidade de palavras é sempre a quantidade de espaços +1. A gente pode usar isso pro nosso programa!
Então vamos implementar! Também existem várias formas, é claro, mas escolhi separar nossa string em uma lista, usando espaço como separador. Pra fazer isso, vamos usar a função split().
Repara que, dessa forma, o método split() faz uma separação na string a cada espaço. Assim, a quantidade de palavras fica igual a quantidade de itens na lista, que a gente pode descobrir com a função len(). Olha como fica no código:
Show! O código atual já é capaz de calcular a quantidade de palavras de um arquivo, mas a gente precisa exibir essa informação pro usuário ainda! Vamos fazer isso...
Passo 4
Bom, pra exibir essa informação pro usuário, vamos usar a função print(). Com ela, vamos usar também formatação de string (que, caso você não lembre, tem aqui na playlist no tópico de operações com string, blz?).
Pronto. Mas aí eu te pergunto… Terminamos?
A gente ainda precisa fechar o arquivo, jae? E pra isso, a gente só precisa chamar o método close() do arquivo no fim!
E agora sim! Mas antes de finalizar, vamos testar...
Passo 4
Pra testar, eu vou usar um arquivo que eu já tenho aqui, mas você poderia criar um qualquer com o bloco de notas, beleza?! Na real, geralmente as questões de arquivos em prova já vem com o arquivo no PC, mas esse enunciado não veio. Então a gente pode testar nós mesmos, sem problemas. O arquivo que vou usar pra testar é esse:
Contei aqui e deu 33 palavras. Vamos ver o que o programa nos diz…
Aí sim! hahaha deu bom… Com isso, finalizamos o exercício! Valeuuu
Resposta
Exercício Resolvido #4
PUC-Rio, INF1025 - Adaptado.
Ler um arquivo texto dado na entrada e contar a quantidade de cada letra (maiúscula ou minúscula) existente no arquivo. Ao final do processamento do arquivo gerar uma listagem indicando, para cada letra, o número de vezes em que ela aparece no arquivo.
Passo 1
Fala aí! Nesse exercício, a ideia é descobrir a quantidade de cada letra em um arquivo. Pra isso, a gente vai ter que contar com algumas gambiarras! Vem comigo...
Então, bora resolver! Vamos começar perguntando pro usuário qual o nome do arquivo que a gente precisa ler. Pra isso, vamos usar a função input().
Aí, quando a gente já tiver o nome, a gente pode abrir o arquivo. Mas se liga, como a gente vai só abrir pra ler e não vai mexer em nada, então a gente pode pedir só permissão de leitura (“r”).
Tipo assim, viu?! Aí agora a gente já tem o arquivo aberto e salvo na variável arq. Vamos contar as letras!
Passo 2
Cara, existem várias formas de fazer isso (assim como todas as resoluções de prog). Mas eu vou escolher fazer uma iteração por todas as linhas do arquivo. E depois, iterar por cada caractere em cada linha! Vamos usar dois laços for pra isso...
Repara também que a gente não pegou a linha pura. Aplicamos nela o método lower()! Isso porque o enunciado diz que a gente tem que desconsiderar letras maiúsculas e minúsculas, tratando como iguais. Então, uma ideia é transformar toda a linha em minúsculo (também poderia ser maiúsculo, com o método upper()).
Beleza! Porém, a gente só quer contar a quantidade de letras. Então, o próximo passo é verificar se esse caractere é uma letra. Então vamos checar usando um if:
Pronto! Agora só precisamos contar…. E pra isso, a gente pode criar, FORA DE TODOS OS LOOPS, uma lista com um item pra cada letra do alfabeto, em ordem alfabética. Aí, a gente só precisa incrementar no lugar certo toda vez que encontrarmos uma letra! Tipo assim, olha:
Agora sim! A gente tem uma lista com 26 elementos 0, um pra cada letra. Se a gente somar a quantidade de letras que tem em cada linha, no fim a gente vai ter a quantidade total de cada, né? Vamos fazer isso!
Passo 3
Mas se liga, como a gente vai saber a posição que tá o elemento certo na lista? Hmmm. Existem algumas formas… Mas vamos usar uma simples: usando o método de string index(). Esse método diz pra gente onde tá uma certa letra em uma string.
Repara que o índice da letra na string contendo todo o alfabeto é o mesmo índice da lista que a gente acabou de criar. Aí, a gente pode incrementar esse índice na lista de contadores!
E pronto! Depois de contar todas as letras, precisamos fechar o arquivo, como sempre. Pra isso, vamos usar, fora dos loops, o método .close().
E agora vamos exibir pro usuário a quantidade de cada letra!
Passo 4
Bom, pra exibir essa informação pro usuário, vamos usar a função print(). Só que a gente precisa usar um print() pra cada letra. Então, vamos usar ainda mais um for.
Além do for, também usamos formatação de string, ok? A gente bateu um papo sobre no tópico Operações com String aqui da playlist.
E, com isso, a gente finalizou o exercício! Te vejo no próximo, ok? É nós!
Resposta
Exercício Resolvido #5
PUC-Rio, Lista 10.
Uma empresa permite que seus funcionários façam chamadas internacionais a partir de
seus ramais, mas mantém um registro dessas ligações no arquivo “ci.txt”. Cada linha do
arquivo contém a matrícula de um funcionário (inteiro), o número de chamadas realizadas
pelo mesmo (inteiro) e a duração em minutos de cada uma das ligações (real). Faça um
programa que leia o arquivo “ci.txt” e gere o arquivo “totais.txt”. O arquivo “totais.txt”
deverá conter, para cada funcionário que efetuou chamadas internacionais, uma linha com
seu número de matrícula e a duração total de suas chamadas. A última linha do arquivo deve
conter a duração total das chamadas internacionais.
Exemplo (apenas um exemplo!):
Passo 1
E aí, doido! Nessa questão o enunciado dá o modelo do arquivo de entrada. A gente precisa fazer um programa que se adapte a esse modelo e faça o que o professor pede. Pra facilitar nossa vida, o professor ainda colocou ali um exemplo do resultado pra gente ver se nosso programa tá funcionando na moral...
Então, primeiramente, vamos criar o arquivo ci.txt com o exemplo do professor, e aí depois vamos fazer o programa pra tentar gerar o totais.txt igual ao do professor.
Criei o arquivo na mesma pasta do programa que a gente tá fazendo, e dentro dele vou copiar o arquivo do enunciado.
Agora, vamos começar os trabalhos no editor de código!
Passo 2
Primeiramente, vamos começar abrindo o arquivo e salvando numa variável. E vamos pedir permissão somente de leitura, usando “r” no segundo parâmetro.
Show! Vamos aproveitar pra abrir também o arquivo que a gente precisa criar, o totais.txt. Pra esse a gente pode pedir permissão somente de escrita! E repara que o arquivo não precisa existir pra gente escrever… Ele vai ser criado automaticamente quando o programa for executado, ok?!
Show! Agora, vamos montar nossa estrutura de leitura dos arquivos… A gente quer ler uma linha de cada vez, então vamos usar um for no arquivo, pra gente conseguir iterar por cada linha.
Pronto! Agora, só falta a gente começar a contar os padrões e escrever no arquivo resultante...
Passo 3
Se liga, a gente tem, em cada linha, várias informações separadas por espaços. Pra gente separar essas informações, a gente pode usar o método de string split(‘ ‘). Esse método vai retornar uma lista com as informações separadas!
Então, a ideia é atualizar a variável linha pra deixar de ser uma string com a linha toda e virar uma lista com todos os elementos. Só que repara que, antes de chamar o método split(‘ ‘), eu chamei o strip(). Isso porque as linhas podem terminar com “\n”, mas a gente não quer saber deles… Então, usamos o strip() pra remover os “\n” das linhas, blz?!
Show! Agora vamos aos padrões… Repara que, no exemplo do enunciado, o arquivo “totais.txt” só tem gente que fez alguma ligação. Então bora começar verificando se o funcionário da linha atual fez alguma ligação.
Pronto! Se a segunda informação da linha for diferente de “0”, então o cara já ligou. E repara que esse 0 tá entre aspas, porque a gente leu ele de um arquivo e ele veio, automaticamente, como string. Precisaremos converter ele jaja, mas agora, vamos começar escrevendo no arquivo de saída a matrícula do funcionário atual.
A gente escreveu a matrícula e, logo depois, escrevemos um espaço também, já que a gente separa as informações por espaços… Agora, a gente precisa calcular o número total de minutos que a pessoa ficou no telefone. Então, vamos iterar!
Pronto! A ideia é que a gente pode iterar por todas as informações de tempo (a partir do terceiro elemento da lista) e calcular o somatório. Mas não esquece que pra gente fazer somas, precisamos que esses dados estejam em tipos numéricos, e o enunciado diz que são reais. Por isso converti pra float ali, beleza?!
Depois disso, a gente já pode escrever, na sequência, a quantidade de minutos que esse funcionário ficou no tel no arquivo totais.txt. Vamos usar o método write() de novo pra escrever.
Pronto! Eu escrevi o total de minutos concatenado com um “\n” pra pular linha no arquivo. Mas a gente já ia esquecendo que o enunciado também pede a quantidade total gasta em minutos por todos os funcionários… Então, vamos criar uma variável pra contar essa informação também!
Levando em consideração que o total gasto é o somatório de minutos gastos de todos os funcionários, então a gente pode, a cada loop, incrementar uma variável… Aí, no fim, essa variável vai ter a quantidade de minutos totais, sacou?!
Beleza! Mas precisamos escrever essa informação depois do final do for...
Passo 4
Quando o programa sair do for, então já verificamos e escrevemos os totais de todos os funcionários. Aí, só falta a gente escrever o número de minutos totais e fechar os arquivos… Mas vamos começar pelo começo.
Pronto! Fora do for a gente escreveu a quantidade de minutos totais, que vai ser a última coisa a ser escrita no arquivo. Mas tu se ligou que a gente não converteu pra string antes de escrever? Não é necessário… A gente só converteu da última vez porque precisávamos concatenar com o “\n”, e só dá pra concatenar strings. Agora, vamos fechar os arquivos.
Aeee! Finalizamos o exercício. Mas calma, vamos executar pra ver se o resultado fica igual ao exemplo do professor… Apertei pra executar aqui e surgiu um novo arquivo na pasta do programa.
Vamos abrir ele...
Igualzinho ao do enunciado! hahahah terminamos, ok?! Valeuuuuu
Resposta
Exercício Resolvido #6
PUC-Rio, Lista 10.
Faça um programa que leia, do arquivo notas.txt, as notas (valor inteiro de 0 a 10) dos
candidatos de um concurso (uma nota por candidato) e exiba a quantidade de candidatos
em cada nota, na forma de histograma, conforme exemplo abaixo (um asterisco para cada
candidato com a nota indicada).
Exemplo de entrada:
1 10
2 0
3 1
4 1
5 10
6 1
7 0
8 10
…
Exemplo da saída:
Nota 0: **
Nota 1: ***
…
Notas 10: ***
Passo 1
Fala aí, meu consagrado! Nesse exercício a gente precisa ler os dados do arquivo notas.txt, analisar e exibir. Me sinto na obrigação de te avisar que esse é o tipo que questão que cai em prova… Repito, não é um treinamento.
Então se liga, a primeira coisa que a gente vai fazer é abrir o arquivo no nosso código… Pra isso, a gente pode usar a função open(). No primeiro parâmetro a gente passa o nome do arquivo (que o enunciado diz que tem que ser notas.txt), e no segundo a operação que a gente quer. Como a gente só quer permissão de leitura, vamos usar o “r”. Fica assim:
Só que pra rodar esse programa a gente precisa ter o arquivo dentro da mesma pasta que o programa. Então, eu já vou copiar o exemplo do enunciado e salvar num arquivo com o nome certinho...
Abri o bloco de notas, escrevi igualzin e salvei na pasta do programa com o nome de notas.txt… Agora vamos continuar nosso programa!
Passo 2
Cara, já temos o arquivo aberto dentro da variável. Agora, bora construir nossa estrutura pra ler uma linha de cada vez…
Pronto! Mas, as informações estão divididas por espaços… Pra gente conseguir acessar elas separadamente, de boas, a gente pode transformar essa linha em uma lista dividida nos espaços! Pra isso a gente usa o método de string .split(‘ ‘). Mas não esquece que, no fim de cada linha do arquivo tem um “\n”.
Dessa forma os dados ficam separadinhos e a gente consegue pegar a parte que nos interessa sem preocupações.. Quer dizer, quase sem preocupações, porque tem o “\n” indesejado ali. Pra tirar ele, a gente pode usar, ANTES do split(‘ ‘), o método strip().
Aí sim, o resultado fica bonitin sem o “\n” no último elemento. Olha como a gente faz pra implementar essa parada:
Show! A gente atualizou a variável “linha”, que começou sendo a string e virou a lista sem o “\n”... Agora vamos pensar em como a gente pode usar esses dados pra contar o número de cada nota!
Passo 3
Mano… Na real, a primeira informação de cada linha é meio inútil. Segundo o enunciado é o número de inscrição, mas a gente só tá preocupado em contar as notas. Uma ideia de como fazer pra contar as notas é criar uma lista com 11 elementos (uma pra cada nota, contando com o 0), e, a cada incidência da nota no loop, a gente incrementa na lista…
Criamos essa lista fora do loop. Mas tu percebe que o índice de cada nota pode ser igual a própria nota?! Tipo, a cada nota 1, a gente incrementa a lista “notas” no índice 1, e assim por diante...
E pra fazer isso a gente pode usar o próprio valor que tem na linha…
Mas repara que a lista “linha” tava guardando todos os valores no formato de string, mas os índices de listas são valores inteiros. Por isso, a gente pode converter pra inteiro e somar 1 nesse índice!
Pronto! Depois de contar todas as notas, a gente só precisa exibir pro usuário!
Passo 4
Pô, pra exibir pro usuário a gente vai usar a função print(), e também vai usar formatação de string, tá?! Mas como a gente tem 11 informações pra exibir, bora fazer um loop…
Se liga no esquema que a gente fez ali na nota… A gente pegou a quantidade de vezes que a nota apareceu, que a gente tinha salvo na lista, e multiplicou pela string ‘*’. Assim, o resultado fica no formato do enunciado, sacou?! hihihi
Até a próxima, maninho! é nóssss
Resposta
Exercício Resolvido #7
PUC-Rio, P3-2019.2.
4) O arquivo consumidores.txt armazena, em cada linha, o nome completo (nome e sobrenome) e a idade de um consumidor de um tipo de biscoito. Esses dados estão separados por vírgula (‘,’).
a) Escreva uma função, chamada geraLista, que:
● Receba o nome desse arquivo (consumidores.txt);
● Retorne uma lista de listas, em que cada lista interna armazena um nome (apenas o nome, sem o sobrenome) e a quantidade de ocorrências desse nome no arquivo.
b) Escreva um programa para testar a função geraLista.
Exemplo:
Arquivo consumidores.txt
Lili Patinhas,12
Lele Patinhas,12
Lala Patinhas,12
Lulu Patinhas,13
Lulu Caldas,35
Dudu Caldas,37
Mari Marinha,45
Pedro Marinha,54
Dudu Marinha,65
Pedro Marinha,12
Lala Marinha,6
Kiko Patinhas,30
Kika Cardosin,23
Lele Cardosin,32
Dudu Cardosin,99
Lista retornada: [ ['Lili', 1], ['Lele', 2], ['Lala', 2], ['Lulu', 2], ['Dudu', 3], ['Mari', 1], ['Pedro', 2], ['Kiko', 1], ['Kika', 1] ]
Passo 1
E aí, chefe! Mano, a questão dá um monte de coisa, mas na verdade só tá pedindo pra gente contar as ocorrências dos primeiros nomes… A gente nem usa as idades pra nada, percebeu?! Em prova, os professores fazem questão com textão achando que vai desmotivar nós HAHAHHA e desmotiva mesmo.
Mas ok, vamos começar a fazer nosso programa. Cara, eu vou criar o arquivo consumidores.txt com os mesmos dados do professor porque eu consigo copiar e colar, mas eu tô ligado que você não vai conseguir copiar do enunciado daí… Então, cria esse arquivo e inventa uns nomes você mesmo, jae?!
Primeiramente, bora construir nossa função, com o nome que o enunciado forneceu...
Essa função tem que fazer todo o processo de leitura e processamento da lista, e retornar essa lista no fim, igual tá no exemplo do enunciado… O parâmetro recebido pela função é o nome do arquivo. Então, bora abrir esse arquivo!
Como a gente só vai ler, a gente pode pedir permissão só de leitura… Justo, né?!
E agora, vamos montar nossa estrutura de repetição que vai ler, linha por linha, o arquivo...
Show! Agora a gente já começa a precisar pensar em como vamos armazenar nossos dados…
Passo 2
Pô, existem várias formas da gente fazer essa parada, mas eu gosto de uma abordagem: fazer a lista linear e depois transformar em uma lista de sublistas… Tipo assim:
A vantagem de trabalhar com a lista linear é que a gente consegue usar os métodos index() e o operador in… Pra construir a lista direto no formato que o enunciado pediu, com sublistas, a gente precisaria criar funções próprias de busca e index. Eu prefiro o que dá menos trabalho!
Então, vamos começar criando a lista que a gente vai usar. E vamos criar ela fora do loop, ok?
Criei a lista com nome de r (de “resultado”). Agora, a cada linha a gente verifica se o nome já tá na lista. Se já tiver a gente incrementa o index do nome +1, se não, a gente adiciona!
Mas primeiro, precisamos extrair o primeiro nome dessa linha… A gente poderia usar o split(‘ ‘) pra isso, porque o nome vai estar sempre antes do primeiro espaço. Não precisamos nos preocupar com a vírgula e nem com o “\n”, afinal, a gente só quer o nome…
O resto da lista fica toda cagada, mas o nome funciona e a gente só precisa do nome… Então, tá ótimo!
Então, vamos salvar o nome numa variável…
Eu criei essa variável com nome de “c” (de “consumidor”). Mas cara, eu só tô usando letras pros nomes porque quero economizar espaço na sua tela, beleza?! Seu professor vai gostar muito mais se você escolher um nome mais autoexplicativo!
E agora vamos fazer a mágica pra contar… Se não existir o nome na lista, adicionamos esse nome e em seguida o número de ocorrência, que começa em 1.
Porém, se o nome já existir, a gente precisa atualizar a contagem pra incrementar +1…
Sacou? A gente tá armazenando as ocorrências de cada nome 1 índice na frente do nome. Então a gente pega o índice do nome, soma 1 e aí a gente vai chegar no número de ocorrências. Depois, a gente incrementa esse número! Pronto… Depois desse for a gente não precisa mais do arquivo, então podemos fechar ele!
Passo 3
Agora a gente já vai ter aquela lista linear, mas precisamos converter pro formato que o professor quer. E, pra isso, a gente pode usar uma técnica sagaz… Olha essa ilustração:
Viu? A gente pode adicionar no fim da lista uma sublista com os dois primeiros elementos, e depois remover esses dois primeiros da lista! Vamo escrever isso lá:
Pronto… A gente adicionou no fim da lista os dois primeiros elementos e depois deletamos eles do início! Só que a gente só fez isso uma vez, e não sabemos quantas vezes precisaremos repetir esse processo… Mas a gente sabe que precisamos repetir até não sobrar nenhum elementos fora de sublista.
Então, vamos repetir esse código até o primeiro elemento ser uma sublista!
Pronto! Agora, o processo vai se repetir até todos os nomes estarem dentro de subslistas… Só precisamos não esquecer que a gente não precisa fazer nada disso se a lista estiver vazia! Então, a gente quer repetir o processo enquanto a lista não for vazia e o primeiro elemento não for uma sublista!
Agora sim! Só precisamos retornar a lista r no final de tudo.
Vamos fazer o programa pra testar, agora...
Passo 4
Cara, nosso programa pra testar é basicamente chamar a função e ver se sai tudo como o esperado. Pra isso, vou usar a função print() pra exibir o resultado da função.
E quando executamos esse programa, o resultado foi exatamente como o esperado (no meu caso, igual ao do enunciado).
Te vejo no próximo exercício, doido! É nósss!
Resposta
Exercício Resolvido #8
PUC-Rio, Lista 10.
Um professor salvou no arquivo "p1.txt": a matrícula e o resultado da prova P1 de cada aluno
de sua turma e no arquivo "t1.txt": a matrícula e a nota do teste T1 de cada aluno de sua
turma. Faça um programa que monte e exiba uma lista onde cada elemento é composto por:
[matrícula do aluno, média G1, [nota da P1, nota da T1]]
A média da G1 é calculada por: (P1*0.8 + T1*0.2)
No final seu programa deve gravar, no arquivo preocupacoes.txt, a matrícula e a média dos
alunos que tiraram menos de 4 na prova P1 ou menos do que 7 no teste T1
Seu programa também deve gravar, no arquivo notas.txt, a matrícula, a média, a nota P1 e a
nota T1 de todos os alunos.
t1.txt:
10 5.8
20 7.6
30 9.0
40 9.3
50 8.9
p1.txt:
10 8.0
20 3.9
30 9.8
40 3.2
50 4.8
Passo 1
Fala aí, meu rei! Essa questão tem a carinha que vai ter a questão da sua prova...
Então se liga… Bora começar abrindo os arquivos. A gente pode já abrir os 4 direto!
Mas se liga nas permissões, tá? Eu usei ‘r’ nos arquivos fornecidos pelo professor, que são somente pra leitura, e usei ‘w’ nos arquivos que o enunciado manda criar!
Agora a gente precisa ler as notas e fazer os trâmites que o enunciado tá mandando… Bora lá!
Passo 2
Primeiro, tá mandando a gente criar uma lista e armazenar a matrícula, média e as notas no seguinte formato:
Ou seja, nossa lista vai ter uma sublista nesse formato pra cada aluno. E talvez você tenha pensado em começar a ler um arquivo de cada vez pra tentar construir esse modelo, mas a gente pode iterar pelos dois arquivos, p1 e t1, ao mesmo tempo! Pra isso, a gente usa a função zip() dentro do laço for:
E, as variáveis p1l e t1l recebem, a cada loop, uma linha de cada um dos arquivos que foram passados dentro da função zip(), respectivamente. Agora, a gente pode começar a tratar os dados. Vamos começar limpando o \n do final de cada linha e separando os dados em uma lista. Pra isso, vamos usar os métodos strip() e split(‘ ‘), respectivamente...
Agora, nossos dados estão separados dentro de listas, todos no formato de string. Pra facilitar nossas vidas, que tal a gente criar uma variável pra cada informação, com seus devidos formatos?
Pronto! A partir daqui, a gente tem uma variável inteira chamada mat (pra matrícula), e duas outras pra salvar as notas da p1 e t1, no formato float. Repara que as matrículas são iguais nos dois arquivos, então tanto faz a gente pegar a matrícula da p1 ou t1. Agora, partiu calcular a média de acordo com a fórmula que o professor passou no enunciado:
Pronto! Agora a gente já tem a média calculada e tem todos os outros dados. Vamos começar a salvar esses dados no padrão que foi mostrado no enunciado dentro da lista (lista que eu chamei de lista por falta de criatividade).
Mas vamo lá! Pra adicionar um novo elemento na lista, bora usar o método append(), que acrescenta um elemento no final de uma lista existente…
E pronto! Dessa forma, todos os alunos vão ter seus dados gravados na lista no formato que o prof falou… Agora, o enunciado também manda a gente escrever umas paradas nos outros arquivos que a gente abriu. Bora lá!
Passo 3
Bom, primeiro a gente precisa escrever no arquivo “notas.txt”, o matrícula, seguido da média e notas p1 e t1 de cada aluno, separado por espaços. A gente pode escrever usando o método de arquivos write(), que recebe UMA STRING como parâmetro. Então, a gente pode usar formatação de string pra escrever os dados com facilidade...
E prontinho… Cuidado que o print() que a gente tá acostumado a usar pula linha automáticamente depois que a gente chama, mas o write de arquivos não. Por isso, temos que por um \n ali no final!
E agora a gente precisa escrever no arquivo preocupacoes.txt a matrícula e a média dos alunos que tiraram menos de 4 na P1 OU menos de 7 no T1. Vamos usar um if pra testar nossas condições...
Repara que a gente usou a mesma tática da formatação de string, e também não esquecemos do “\n” no fim da linha…
Show! Agora, só falta a gente fechar os arquivos e exibir a lista pro usuário...
Passo 4
Você não achou que a gente tinha terminado antes de fechar os arquivos, né? hahaha
Precisamos fechar todos os arquivos que abrimos… E, como o enunciado também manda a gente exibir a lista que criamos, bora dar um print nessa danada!
E agora,sim a gente pode dizer que terminou o exercício!
Até a próxima, maninho! é nóssss