Categorias
Introdução à Programação para Bioinformática com Perl

Manipulando arquivos

Capítulo 6

Este conteúdo faz parte do livro “Introdução à Programação para Bioinformática com Perl“. Você pode adquirir a versão impressa desse livro aqui ou a versão para Kindle aqui. Para nos citar, consulte este link.

Manipulação de arquivos é um requisito importante para bioinformatas, seja para armazenar resultados de um determinado script desenvolvido ou até mesmo para receber arquivos como parâmetro em seu programa. Neste capítulo abordaremos como ler, criar e gravar arquivos em unidades de armazenamento.

Abrindo arquivos

Perl fornece a função open para abertura de arquivos. A sintaxe básica da função inclui o uso de um apelido para o arquivo, seguido do modo de abertura, além do nome do arquivo.

open(apelido, “modo de abertura”, “nome do arquivo”);

O modo de abertura refere-se a forma a qual o arquivo será aberto. Resumidamente podemos definir que há três modos de abertura: (i) somente leitura; (ii) escrita; e (iii) escrita incremental. E cada um desses modos ainda pode ser auxiliado pelo caractere “+”, que permite ao modo as características de leitura e gravação.

O modo de leitura “<” permite apenas que um arquivo já existente seja aberto e lido, e só permite a gravação se for substituído pelos dois caracteres “+<”.

O modo de gravação “>” ou “+>”, além de permitir a leitura a gravação de informações em arquivo ainda permitem a criação de novos arquivos. Se no diretório de armazenamento já existir um arquivo com o mesmo nome, o modo de gravação irá apagar o arquivo e criar um novo arquivo vazio.

O modo de gravação incremental “>>” ou “+>>” permite a gravação em um arquivo já existente sem subscrever os dados. Permite também a criação de um novo arquivo caso não haja nenhum outro arquivo com o mesmo nome no diretório de armazenamento.

ModoOperadorCria novo arquivoDeleta se o arquivo já existir
Leitura <
Escrita>xx
Incremental>>X
Leitura/Escrita+<
Leitura/Escrita+>xx
Leitura/Escrita incremental+>>x

Quando a abertura do arquivo utilizar o modo de somente leitura, o operador pode ser desprezado.

open(ARQUIVO_X, “arquivo_x.txt”);

O operador também pode ser declarado junto ao nome do arquivo. No exemplo abaixo, o “arquivo_x.txt”, cujo apelido é ARQUIVO_X, será aberto em modo de gravação incremental, ou seja, se o arquivo já existir seu conteúdo não será apagado, e novas informações serão acrescentadas após a última linha.

open(ARQUIVO_X, “>>arquivo_x.txt”);

Ao declarar o nome do arquivo devemos ter em consideração que o arquivo deverá estar no mesmo diretório a qual se encontra o script. Caso não esteja, é recomendado a declaração do endereço completo do arquivo.

open(ARQUIVO_X, “/home/usuario/outra_pasta/arquivo_x.txt”);

Lendo arquivos

Uma vez que um arquivo foi aberto, ele pode ser lido com o auxílio do operador <>. Há diversas formas de se ler o conteúdo de um arquivo. Uma das formas é transferir todo conteúdo de um arquivo para um array.

open(ARQUIVO_X, “>>arquivo_x.txt”);
@conteudo = <ARQUIVO_X>;

Outra forma é utilizar um laço while para ler uma linha de cada vez.

open(ARQUIVO_X, “>>arquivo_x.txt”);

while ($linha_atual = <ARQUIVO_X>){
print $linha_atual;
}

Gravando em arquivos

Para gravar em arquivos basta apenas utilizar o comando print seguido do apelido do arquivo e da mensagem que se deseje gravar. Lembre-se da importância dos modos de leitura e gravação. Toda vez que executar o comando que abre um arquivo em modo gravação, se o arquivo já existir, o conteúdo será apagado. Se deseja que o conteúdo seja mantido, utilize o modo de gravação incremental.

open(ARQUIVO_X, “>>arquivo_x.txt”);
print ARQUIVO_X “Nova mensagem”;

Fechando arquivos

Após abrir e gravar em um arquivo, você deve fechá-lo. Se você se esquecer de fechar o arquivo, Perl o fechará ao final do script, entretanto é uma boa prática fechar o arquivo antes do fim do script. Para fechar um arquivo utilize o comando close seguido do apelido.

close (ARQUIVO_X);

Comando die

Se sua aplicação não possuir permissões de acesso, a abertura do arquivo pode falhar. Assim convém inserir o comando die, que interrompe a aplicação e mostra uma mensagem ao usuário caso a abertura do arquivo falhe.

open (ARQUIVO_X, “>arquivo_x.txt”) or die(“Falha ao abrir arquivo”);

Reconhecendo argumentos enviados na chamada de scripts

Muitas vezes um programador precisará desenvolver scripts que analisam centenas ou milhares de arquivos com arquiteturas similares. Logo, torna-se inviável editar o script para alterar o nome de um arquivo a ser aberto toda vez que for necessário. Perl fornece métodos para envio de informações ao script durante a execução.

No exemplo abaixo demonstraremos o envio de três argumentos na chamada do script no terminal ou CMD.

perl meu_script.pl argumento1 argumento2 argumento3

Perl recebe os argumentos através do array “@ARGV”.

# Execute: perl c6_s1.pl argumento1 argumento2 argumento3
use strict;

my $argumento;

# Imprimindo argumentos enviados na chamada do programa
foreach $argumento (@ARGV){
	print "$argumento\n";
}
# argumento1
# argumento2
# argumento3

Utilizando argumentos podemos criar um programa que leia quantos arquivos forem enviados pelo usuário. Primeiro crie três arquivos de texto, com diferentes conteúdos. Chame-os de “arquivo1.txt”, “arquivo2.txt” e “arquivo3.txt”. Pode escrever qualquer coisa nos arquivos, entretanto na tabela abaixo há algumas frases que podem ser usadas.

arquivo1.txtarquivo2.txt arquivo3.txt
Olá, mundo!Estou aprendendo Perl! I S2 Bioinformática!

Agora vamos criar um script que leia quantos arquivos forem enviados. Nosso script deve abrir o arquivo como somente leitura, ler todas as linhas e depois fechá-lo.

use strict;

# Lendo varios arquivos
my $a;
my $linha;

# Para cada arquivo enviado como parametro:
foreach $a (@ARGV){

	print "Lendo o arquivo: $a\n";

	# Abrindo o arquivo como somente leitura
	open (ARQUIVO, $a);

	while($linha = <ARQUIVO>){
		print $linha;
	}

	print "\n\n--------- FIM DO ARQUIVO ---------–\n\n";
	close(ARQUIVO);
}

Se você tiver utilizado os modelos de arquivos indicados, obterá como resultado a seguinte mensagem:

Lendo o arquivo: arquivo1.txt
Olá, mundo!

--------- FIM DO ARQUIVO ---------–

Lendo o arquivo: arquivo2.txt
Estou aprendendo Perl!

--------- FIM DO ARQUIVO ---------–

Lendo o arquivo: arquivo3.txt
I S2 Bioinformática!

--------- FIM DO ARQUIVO ---------–

Tome cuidado ao imprimir arquivos muito grandes. Perl é capaz de ler uma grande quantidade de arquivo em um tempo curto, entretanto se utilizar a função print você reduzirá consideravelmente o desempenho de seu programa.

Lendo todos os arquivos de uma pasta

Caso a quantidade de arquivos seja grande demais para ser digitada é possível ainda utilizar as funções opendir para abrir um diretório e readdir para ler todo seu conteúdo.

No exemplo a seguir, primeiro receberemos o nome ou endereço completo do diretório que queremos ler. Em seguida, usando a função opendir declararemos um apelido para o diretório, e então inseriremos o nome que do diretório que será aberto. Usaremos a função readdir para ler cada arquivo da pasta e armazenar em um array. A função readdir recebe como parâmetro o apelido do diretório. Depois, fecharemos o diretório com a função closedir. Por fim, abriremos cada arquivo e faremos a leitura de seu conteúdo.

use strict;

my $diretorio = $ARGV[0];
opendir(diretorio, "$diretorio");

my @arquivos = readdir(diretorio);
closedir(diretorio);

my $a;
my $linha;

foreach $a(@arquivos){

	# Lendo apenas arquivos TXT
	if(substr($a, -3, 3) eq "txt"){

		print "Lendo o arquivo: $a\n";

		# Abrindo o arquivo como somente leitura
		open (ARQUIVO, $a);

		while($linha = <ARQUIVO>){
			print $linha;
		}

		print "\n\n------ FIM DO ARQUIVO -----–\n\n";
		close(ARQUIVO);
	}
}

Observe que, após a abertura do laço de repetição que percorre cada item presente na pasta, inserimos a linha “if(substr($a, -3, 3) eq "txt"){“. Essa linha restringe a impressão de apenas arquivos com extensão “txt”.  Filtrar o conteúdo da pasta é muito importante, uma vez que sistemas operacionais possuem arquivos ocultos, que são úteis para o correto funcionamento do sistema, mas muitas vezes irrelevantes para nossa aplicação.

Para executar o script podemos utilizar as seguintes linhas de comando:

perl nome_do_script.pl .

Troque nome_do_script.pl pelo nome que você deu ao script. O caractere “.” indica que os arquivos que desejamos ler estão no mesmo diretório do script executado. Caso tenha interesse em ler arquivos em outro diretório, altere o “.” pelo nome do diretório. Recomendamos o uso do caminho completo do diretório. Em sistemas operacionais Linux ou MacOS deve ser parecido com: “/home/usuario/scripts/arquivos”; ou no sistema operacional Windows com: “C:/users/usuario/scripts/arquivos”.

Quer aprender mais? Conheça nossos cursos profissionalizantes à partir de R$19,99:

Nota do autor
Prefácio

Capítulo 1
Introdução ao Perl

Capítulo 2
Comandos condicionais

Capítulo 3
Strings

Capítulo 4
Arrays

Capítulo 5
Laços de repetição

Capítulo 6
Manipulando arquivos

Capítulo 7
Sub-rotinas

Capítulo 8
“O guia de sobrevivência para expressões regulares em Perl”

Capítulo 9
Introdução ao BioPerl

Capítulo 10
Sequências

Capítulo 11
BLAST

Capítulo 12
Estruturas de proteínas

Capítulo 13
Hierarquia do BioPerl

Epílogo
Referências bibliográficas
Sobre os autores

Por favor, nos cite:

MARIANO, DIEGO CÉSAR BATISTA; de MELO-MINARDI, R. C. . Introdução à Programação para Bioinformática com Perl. 1. ed. North Charleston, SC (EUA): CreateSpace Independent Publishing Platform, 2016. v. 2. 200p .

Por Diego Mariano

Doutor em Bioinformática pela Universidade Federal de Minas Gerais com atuação na área de ciência de dados e aprendizado de máquina aplicados ao aperfeiçoamento de enzimas usadas na produção de biocombustíveis. Mestre em Bioinformática, também pela UFMG, atuando na área de desenvolvimento de sistemas Web para montagem de genomas. Atualmente realiza estágio pós-doutoral no Departamento de Ciência da Computação da UFMG com foco em desenvolvimento de sistemas Web para Bioinformática, análise exploratória e visualização de dados. Tem conhecimentos nas linguagens: PHP, JavaScript, Python, R, Perl, HTML, CSS e SQL.