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