Arquivos

Teoria Completa

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á!

Expandir

Exercício Resolvido #1

PUC-Rio, INF1025.

Ler arquivo cujo nome é indicado na entrada e exibir as suas 10 primeiras linhas.

MOSTRAR SOLUÇÃO COMPLETA

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’.

MOSTRAR SOLUÇÃO COMPLETA

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

Exercício Resolvido #3

PUC-Rio, INF1025 - Adaptado.

Ler um arquivo e exibir a quantidade de palavras presentes no arquivo indicado pelo usuário.

MOSTRAR SOLUÇÃO COMPLETA

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.

MOSTRAR SOLUÇÃO COMPLETA

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!