Descomplicando a função open() em Python: aprenda a manipular arquivos
- #Python
É de conhecimento da comunidade Python, o tanto de funções que esta linguagem de programação oferece, as quais são ferramentas úteis para solucionar uma variedade de problemas envolvendo a tecnologia. Neste artigo, abordarei sobre a função open() em Python, a qual desempenha um papel importante na leitura e escrita de arquivos, um aspecto essencial para desenvolver aplicações e manipular dados.
Função open()
O recurso open() retorna um objeto arquivo possível de manipulação, isto é, leitura e escrita do mesmo. A estrutura de chamada mais comum e utilizada é:
open(nome_do_arquivo, modo, encoding=None)
Dois argumentos posicionais (nome_do_arquivo e modo), e um argumento nomeado (encoding). Intuitivamente, primeiro argumento posicional é uma string contendo o nome do arquivo, caso o arquivo desejado esteja no diretório atual, apenas o nome é necessário, mas se estiver em outro diretório, digite o caminho completo. Temos o segundo argumento posicional, que também é uma string, contendo alguns caracteres que descrevem o modo que o arquivo será usado. Em seguida, o argumento nomeado 'encoding' faz referência à codificação no modo texto, isto é, de binário para caracteres (se o arquivo for aberto no modo binário, o encoding obviamente não será necessário). Neste argumento, o padrão mais moderno na web e em sistemas operacionais é o UTF-8, mas caso seja omitido, o padrão é definido pela plataforma.
Modos do open():
Imagem informativa sobre os principais modos de uso do arquivo na função open() em Python.
Caso o modo seja omitido, o padrão da função é 'r' (read). O modo 't' (text) também é incluído como padrão no modo. Mas, em diferentes cenários, a utilização de outro modo pode ser mais adequado, como: 'b' (modo binário), 'w+' (escrita + leitura, apaga o conteúdo existente), 'w+b' (escrita + leitura, apagando o conteúdo existente e em modo binário), 'r+b' (leitura + escrita, sem apagar o conteúdo existente e em modo binário), entre vários outros.
Que tipos de arquivos a função open() suporta?
Na verdade, a função suporta uma variedade de arquivos, sendo bastante flexível, exemplo: arquivos de texto, arquivos binários (como imagem, e áudio para leitura binária 'rb', escrita binária 'wb' ou adição binária 'ab'), arquivos de texto Unicode, arquivos especiais do sistema, entre outros.
Para finalmente conseguir manipular o arquivo desejado, é importante ter conhecimento sobre os métodos do objeto arquivo.
Métodos do objeto arquivo
Para ser possível manipular o objeto arquivo que é criado após a chamada da função open(), foram criados métodos que simplifica essa manipulação.
Para isso vamos criar um objeto arquivo de texto e atribuir a variável 'arquivo':
arquivo = open('arquivo.txt', 'r+', encoding='utf-8')
write(string):
Este método escreve no arquivo, recebendo como argumento uma string (ou seja, é necessário converter para string, caso não seja).
arquivo.write('Essa é a primeira linha do arquivo')
read(tamanho):
Este método recebe opcionalmente um argumento 'tamanho' que se refere a quantidade de caracteres que será lido (incluindo espaços). Caso esse argumento seja omitido, o padrão é ler todo o arquivo.
readline() e readlines():
Método readline() lê apenas uma linha do arquivo, uma maneira alternativa simples de ler todas as linhas com este método é iterando com for:
arquivo.write('\nEssa é a segunda linha do arquivo')
for line in arquivo:
print(line, end='')
ou usando o método readlines():
arquivo.readlines()
A saída foi:
Essa é a primeira linha do arquivo
Essa é a segunda linha do arquivo
Atente-se ao ponteiro no arquivo quando for realizar alguma escrita, pois alguns modos têm como padrão o ponteiro no início, e ao fazer a escrita pode ocorrer perda de dados por substituição. Mas não se preocupe, existem dois métodos relacionado a isso: um informa onde o ponteiro se encontra no arquivo, e o outro manipula a posição do ponteiro.
tell() e seek(offset, de_onde):
Ao chamar o método tell(), a posição do ponteiro será informado na saída.
print(arquivo.tell())
A saída foi:
0
Percebe-se que o ponteiro está no início, isso se dá por conta do modo de uso 'r+' do meu objeto arquivo, que, como padrão, posiciona o ponteiro no início do arquivo.
Então, para manipular o ponteiro, usa-se o método seek():
arquivo.seek(0, 2)
Nesse método seek(offset, de_onde), o offset é o deslocamento do ponteiro de acordo com um ponto de referência 'de_onde', que é o segundo argumento. Para referências temos:
'0': início do arquivo
'1': posição atual do arquivo
'2': final do arquivo
Como quero deslocar apenas para o final do arquivo, então offset = 0, e de_onde = 2.
print(arquivo.tell())
A saída foi:
71
Existem outros métodos, que não são utilizados com tanta frequência, então, não irei adicioná-los neste artigo.
Lembre-se de fechar o arquivo para liberar recursos ao sistema operacional:
arquivo.close()
Boas práticas com with/as
O recurso with/as do Python é muito útil. Quando utilizado para criação do objeto arquivo com open(), não é necessário fechar o objeto arquivo com close(), pois ele é fechado automaticamente.
with open('arquivo.txt', 'r+', encoding='utf-8') as f:
f.seek(0, 2)
f.write('\nEssa é a terceira linha do arquivo')
# Neste código acima, o objeto arquivo foi atribuído à variável 'f'.
with open('arquivo.txt', 'r+', encoding='utf-8') as f:
print(f.read())
A saída foi:
Essa é a primeira linha do arquivo
Essa é a segunda linha do arquivo
Essa é a terceira linha do arquivo
with open('arquivo.txt', 'w', encoding='utf-8') as f:
for linha in range(1, 11):
f.write(f'Essa é a linha número: {linha}')
código executado, vamos para leitura:
with open('arquivo.txt', 'r', encoding='utf-8') as f:
print(f.read())
A saída foi:
Essa é a linha número: 1
Essa é a linha número: 2
Essa é a linha número: 3
Essa é a linha número: 4
Essa é a linha número: 5
Essa é a linha número: 6
Essa é a linha número: 7
Essa é a linha número: 8
Essa é a linha número: 9
Essa é a linha número: 10
Fluxo da função open():
Como foi citado no início, a estrutura de chamada open() mais utilizada e comum é:
open(nome_do_arquivo, modo, encoding=None)
Mas dentro da função existem outros argumentos opcionais que podem ser incluídos em um determinado contexto. Não os citei nesse artigo, pois esses argumentos são usados em cenários específicos.
open(nome_do_arquivo, modo, enconding=None, errors=None, newline=None, closefd=True, opener=None)
Conclusão
Em síntese, vimos a utilidade da função open() em manipular arquivos através do Python de maneira descomplicada, como prometido no título, e abstraída para facilitar o aprendizado (simplicidade é o sobrenome do Python). Para quaisquer dúvidas, curiosidades, ou necessidades, consulte a documentação do Python, na qual me baseei para aprender e escrever este artigo.
Links para a documentação Python:
https://docs.python.org/pt-br/3/tutorial/inputoutput.html#reading-and-writing-files
https://docs.python.org/pt-br/3/library/functions.html#open