Leitura e gravação em arquivos com Python – Lendo arquivos de texto

Leitura e gravação em arquivos com Python

Uma das tarefas mais importantes que realizamos no dia-a-dia é a manipulação de dados gravados em arquivos, dos mais variados tipos. Por exemplo, um administrador de sistemas precisa, com frequência, acessar informações de configuração armazenadas em arquivos de texto, e muitas vezes, efetuar alterações nesses arquivos.

Nesta lição vamos estudar os métodos para leitura e gravação de dados em arquivos utilizando Python. Os arquivos são muito importantes, pois permitem que os dados se tornem persistentes, podendo ser recuperados e utilizados sempre que for necessário, independentemente do programa ou script.

Tipos de arquivos: texto simples e binário

Um arquivo é uma área no disco onde gravamos e de onde lemos dados. Um arquivo pode ser de texto simples ou um arquivo binário.

Arquivos de texto (plaintext) são uma sequência estruturada de linhas, que contém cada uma uma sequência de caracteres, sem informações sobre formatação.

Cada linha em um arquivo de texto é terminada com um caractere especial de fim de linha, EOL (End of Line). No geral, é o caractere newline (\n). Esse caractere finaliza a linha atual e diz ao interpretador que uma nova linha se inicia.

Já um arquivo binário é qualquer arquivo que não seja arquivo de texto padrão. Os arquivos binários somente devem ser processados por uma aplicação que compreenda a estrutura do arquivo. Como exemplos, temos arquivos pdf, doc, imagens, executáveis, mp3 e planilhas.

Trabalhando com arquivos em Python

Para trabalharmos com arquivos no Python usaremos o objeto file.

Os objetos file contém métodos e atributos que podem ser usados para coletar informações e manipular um arquivo.

Um objeto file possui um atributo nome, que é o nome do arquivo a ser manipulado, e um atributo modo, que é o modo como o arquivo será acessado.

Modos de acesso a arquivos

Os modos de acesso a um arquivo disponíveis em Python estão listados na tabela a seguir:

Modo Tipo de acesso
r Somente leitura
w Escrita, apagando (truncando) o conteúdo existente no arquivo
a Escrita, preservando o conteúdo existente (append). O arquivo é criado, se não existir. O texto é inserido no final do arquivo.
b Modo binário
+ Abre o arquivo para atualização – leitura e escrita
x

Abre o arquivo para criação exclusiva, falhando se o arquivo já existir.

t

Modo de texto (padrão)

Podemos combinar os modos, por exemplo r+, w+, w+b. O modo padrão é r (leitura) de texto, caso não seja especificado.

Para trabalhar com arquivos de texto precisamos efetuar as seguintes operações, em sequência:

  • Abrir o arquivo no modo desejado
  • Chamar o método apropriado (leitura/escrita)
  • Executar o processamento dos dados do arquivo
  • Fechar o arquivo.

Abrindo arquivos para leitura

A função open() retorna um objeto manipulador de arquivos, que é um objeto iterável usado para realizar operações sobre um arquivo.

Sintaxe:

manipulador = open(arquivo, modo)

arquivo é uma string que indica o nome / caminho do arquivo a ser aberto no sistema de arquivos. Se o arquivo não estiver no mesmo diretório onde o script se encontra, devemos informar o caminho completo como parâmetro da função open().

modo é opcional, sendo que o padrão é t (modo de texto).

Não é necessário importar nenhum módulo para usar os manipuladores de arquivos.

Quando um arquivo é lido, o Python mantém um registro da posição atual de leitura no arquivo. Se ele for lido com o método read(), a posição será sempre a do final do arquivo, pois esse método retorna o arquivo inteiro de uma vez. Caso a função read() seja chamada novamente, logo na sequência, uma string vazia será retornada, pois não há mais dados a serem lidos na posição atual no arquivo.

Podemos alterar o ponteiro de arquivo por meio do método seek(), que recebe como argumento a posição desejada – um offset (deslocamento) em bytes.

Para voltarmos ao início do arquivo, usamos a posição zero, como seek(0). Caso você queira ir até o oitavo byte, por exemplo, use seek(8). NO geral, o número do byte corresponde ao número do caractere no arquivo, exceto quando são usados caracteres que ocupam mais de um byte, como as codificações de idiomas asiáticos em UTF-8.

Também podemos descobrir a posição atual dentro do arquivo com o método tell().

Veja os exemplos a seguir, nos quais utilizamos um arquivo de nome arq01.txt:

arquivo = open('arq01.txt,'r')
print('Posição atual no arquivo: ' + arquivo.tell())
 print(arquivo.read())
print('Posição atual no arquivo: ' + arquivo.tell())
 print(arquivo.read())
arquivo.seek(0)
 print('Posição atual no arquivo: ' + arquivo.tell())
 print(arquivo.read())
arquivo.close()

Podemos usar o método read() para ler um número determinado de caracteres, bastando para isso passar com argumento a quantidade de bytes a ser lida. Por exemplo, se quisermos ler os primeiros 8 bytes do arquivo:

arquivo.read(8)

Métodos readline() e readlines()

Além do método read(), visto anteriormente, também podemos ler o conteúdo de u arquivo usando os métodos readline() e readlines().

Método readline()

Retorna uma linha do texto a cada chamada, na ordem em que aparecem no arquivo (um ponteiro de linha é incrementado a cada nova chamada ao método).

Método readlines()

Retorna uma lista de valores de string do arquivo, sendo que cada string corresponde a uma linha do texto.

É mais fácil trabalhar com o método readlines() do que com o método read().

O exemplo de código a seguir permite comparar os processos de leitura de um arquivo com os três métodos apresentados:

# Testando os métodos read(), readline() e readlines()
manipulador = open('arquivo.txt','r')
print("\nMétodo read():\n")
print(manipulador.read())

manipulador.seek(0) # Volta para o início do arquivo

print("\nMétodo readline():\n")
print(manipulador.readline())
print(manipulador.readline())

manipulador.seek(0)
print("\nMétodo readlines():\n")
print(manipulador.readlines())
manipulador.close()

Lendo um arquivo com laço for

Ao usar a iteração com laço for, não é necessário invocar os métodos read(), readline() ou readlines(). Veja o exemplo a seguir:

manipulador = open('arquivo.txt','r')
for linha in manipulador:
    print linha
manipulador.close()

Esse script retorna a seguinte saída:

Lendo arquivos com Python - 01

Note que a função print() insere um caractere \n automaticamente ao final de cada linha, resultando em linhas em branco retornadas junto com o texto.

Podemos eliminar essa linha em branco usando o método rstrip(), que elimina espaços no início de uma string, pois os caracteres \n são tratados com espaços:

manipulador = open('arquivo.txt','r')
for linha in manipulador:
    linha = linha.rstrip()
    print linha
manipulador.close()

Resultado:

Ler arquivos em Python usando método open e rstrip

Fechando um arquivo

Uma boa prática é sempre fechar um arquivo após o término das operações sobre ele. Para fechar um arquivo, usamos o método close() no objeto, como em:

arquivo.close()

Os objetos file possuem um atributo closed que retorna True se o arquivo estiver fechado, e retorna False se o arquivo ainda estiver aberto. Desta forma, é possível verificar se um arquivo foi realmente fechado ou não. Veja o exemplo a seguir:

arquivo = open('arq01.txt,'r')
conteudo_arquivo = arquivo.read()
print('Arquivo fechado?'.format(arquivo.closed))
if not arquivo.closed:
  arquivo.close()
print('Arquivo fechado? {}'.format(arquivo.closed))

Também é possível fechar um arquivo automaticamente. Para isso, usamos a declaração with, como no exemplo a seguir:

with open('arq01.txt','r') as arquivo:
 print("Arquivo fechado?".format(arquivo.closed))
 print(arquivo.read())
print("Leitura do arquivo finalizada.")
print("Arquivo fechado?".format(arquivo.closed))

Neste exemplo, o arquivo é aberto, lido, e após o término da leitura, é automaticamente fechado, não sendo necessária a invocação do método close().

Na próxima lição vamos aprender a escrever dados dentro do arquivo em Python.

 

 

Sobre Fábio dos Reis (1312 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 25 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Unix, Linux e Open Source em geral, adora Eletrônica e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

1 Trackbacks & Pingbacks

  1. Como gravar dados em arquivos de texto com Python - Bóson Treinamentos em Tecnologia

Escreva um comentário

Seu e-mail não será divulgado


*