Exercícios Resolvidos de Arquivos

Ver Teoria

Enunciado

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 :)