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.
Modo | Operador | Cria novo arquivo | Deleta se o arquivo já existir |
Leitura | < | ||
Escrita | > | x | x |
Incremental | >> | X | |
Leitura/Escrita | +< | ||
Leitura/Escrita | +> | x | x |
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.txt | arquivo2.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:
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 .