Aula 20 – Python – Biblioteca Padrão – Módulo IO
Aula 20 – Python – Biblioteca Padrão – Módulo I/O
Que fazer esse curso com certificação?
Acesse:
https://workover.com.br/python-codigo-fluente
Voltar para página principal do blog
Todas as aulas desse curso
Aula 19 Aula 21
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Esse é o link do código fluente no Pinterest
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Automatize tarefas do dia a dia com python:
Seguindo 😉
Biblioteca Padrão do Python
Módulo I/O – Ferramentas para streams
O módulo IO serve para lidar com vários tipos de E/S.
Existem três tipos principais de I/O: I/O de texto, binário e bruto(raw).
Um objeto pertencente a qualquer categoria I/O é chamado de arquivo objeto.
Outros termos comuns são stream e file-like object.
Independentemente da categoria, cada objeto stream também tem vários recursos.
Pode ser leitura(r), gravação(w).
Também pode permitir acesso aleatório arbitrário (buscando para frente ou para trás em qualquer local) ou apenas acesso sequencial (por exemplo, no caso de um socket ou pipe).
Com stream, devemos ter cuidado com o tipo de dado que fornecemos a ele.
Por exemplo, dar um objeto str ao método write() de um stream binário gerará um TypeError.
O mesmo acontece se atribuir um objeto do tipo bytes ao método write() de um stream de texto.
Alterado na versão 3.3:
As operações que costumavam gerar IOError agora geram o OSError, já que o IOError agora é um alias do OSError.
Text I/O
Um Text I/O espera e produz objetos str.
A maneira mais fácil de criar um stream de texto é com open(), opcionalmente especificando um encoding:
f = open("text_input.txt")
#Ou usando um encoding opcionalmente
f = open("text_input.txt", "r", encoding="utf-8")
Depois de abrir um arquivo, a próxima coisa a aprender é como fechá-lo.
Aviso: você deve sempre garantir que um arquivo aberto seja fechado corretamente.
É importante lembrar que é sua responsabilidade fechar o arquivo.
Na maioria dos casos, após o encerramento de um aplicativo ou script, um arquivo precisará será fechado.
No entanto, não há garantia de quando exatamente isso acontecerá.
Isso pode levar a comportamentos indesejados.
Também é uma prática recomendada no Python garantir que seu código se comporte de maneira bem definida reduzindo qualquer comportamento indesejado.
Ao manipular um arquivo, existem duas maneiras de garantir que um arquivo seja fechado corretamente, mesmo quando houver um erro.
A primeira maneira de fechar um arquivo é usar o bloco try-finally:
reader = open('text_input.txt')
try:
#O processamento do arquivo vai ser aqui
finally:
reader.close()
A segunda maneira de fechar um arquivo é usar a instrução with:
with open('text_input.txt') as reader:
#O processamento do arquivo vai ser aqui
A instrução with cuida automaticamente do fechamento do arquivo quando ele sai do bloco with.
O mesmo em casos de erro.
É recomendado que você use a declaração with, tanto quanto possível, pois ela permite um código mais limpo e facilita a manipulação de erros inesperados.
Os streams de texto em memória também estão disponíveis como objetos StringIO:
import io
f = io.StringIO("alguns dados de texto")
Text File Types
O arquivo de texto é o arquivo mais comum que você vai encontrar.
Aqui estão alguns exemplos de como esses arquivos são abertos:
open('text_input.txt')
#leitura
open('text_input.txt', 'r')
#escrita
open('text_input.txt', 'w')
Com esses tipos de arquivos, open() irá retornar um objeto arquivo tipo TextIOWrapper.
file = open('text_input.txt')
type(file)
#Saída:
<class '_io.TextIOWrapper'>
Este é o objeto de arquivo padrão retornado por open().
Binary I/O
O binary I/O, também chamada de buffered I/O, espera objetos semelhantes a bytes e produz objetos bytes.
Nenhuma codificação, decodificação ou tradução de nova linha é executada.
Essa categoria de streams pode ser usada para todos os tipos de dados que não são de texto e também quando o controle manual ao lidar com dados de texto é desejado.
A maneira mais fácil de criar um fluxo binário é usando open() com ‘b‘ na string de modo.
#Abre um arquivo png no modo leitura em binário
f = open("python_logo.png", "rb")
type(f)
<class '_io.BufferedReader'>
#Abre um arquivo png no modo escrita em binário
f2 = open("python_logo.png", "wb")
type(f2)
<class '_io.BufferedWriter'>
Os streams binários em memória também estão disponíveis como objetos BytesIO:
import io
f3 = io.BytesIO(b"Alguns dados binary iniciais: \x00\x01")
type(f3)
<class '_io.BytesIO'>
f3.getvalue()
#Saída: b'Alguns dados binários iniciais: \x00\x01'
Raw I/O
A Raw I/O, também chamada de I/O sem buffer, é geralmente usado como um componente básico de baixo nível para streams binárias e de texto.
Raramente é útil manipular diretamente um stream bruto.
No entanto, você pode criar um stream bruto abrindo um arquivo no modo binário com o buffer desativado:
f4 = open("python_logo.png", "rb", buffering=0)
type(f4)
<class '_io.FileIO'>
Usando o mesmo arquivo text_input.txt com uma lista de linguagens de programação que usamos acima, vamos ver alguns exemplos de como usar esses métodos.
Esse é um exemplo de como abrir e ler o arquivo inteiro usando .read ().
with open('text_input.txt', 'r') as reader:
#Ler e imprime o arquivo inteiro
print(reader.read())
Saída:
Principais linguagens de programacao
JavaScript
Python
Java
Ruby
PHP
C++
C#
Go
C
Swift
Aqui está um exemplo de como ler 5 bytes de uma linha de cada vez usando o método .readline () do Python.
with open('text_input.txt', 'r') as reader:
#Ler e imprime o arquivo inteiro
print(reader.readline(5))
print(reader.readline(5))
print(reader.readline(5))
Saída:
Princ
ipais
ling
Exemplo de como ler um arquivo inteiro como uma lista usando o método .readlines () do Python
f = open('text_input.txt')
f.readlines() # Retorna uma lista de objetos
['Principais linguagens de programacao\n', 'JavaScript\n', 'Python\n', 'Java\n', 'Ruby\n', 'PHP\n', 'C++\n', 'C#\n', 'Go\n', 'C\n', 'Swift']
O exemplo acima também pode ser feito usando list() para criar uma lista a partir do objeto file.
f = open('text_input.txt')
list(f)
['Principais linguagens de programacao\n', 'JavaScript\n', 'Python\n', 'Java\n', 'Ruby\n', 'PHP\n', 'C++\n', 'C#\n', 'Go\n', 'C\n', 'Swift']
Iterando sobre cada linha no arquivo
Uma coisa comum de se fazer durante a leitura de um arquivo é iterar sobre cada linha.
Esse exemplo a seguir mostra como usar o método .readline () do Python para executar essa iteração.
with open('text_input.txt', 'r') as reader:
#Ler e imprime o arquivo inteiro linha por linha
line = reader.readline()
while line != '': #O caractere EOF é uma string vazia
print(line, end='')
line = reader.readline()
Saída:
Principais linguagens de programacao
JavaScript
Python
Java
Ruby
PHP
C++
C#
Go
C
Outra maneira de iterar sobre cada linha do arquivo é usar o método .readlines () do Python no objeto arquivo.
Lembre-se, .readlines() retorna uma lista onde cada elemento da lista representa uma linha no arquivo.
with open('text_input.txt', 'r') as reader:
for line in reader.readlines():
print(line, end='')
Saída:
Principais linguagens de programacao
JavaScript
Python
Java
Ruby
PHP
C++
C#
Go
C
No entanto, os exemplos acima podem ser mais simplificados iterando sobre o próprio arquivo objeto.
with open('text_input.txt', 'r') as reader:
#Ler e imprime o arquivo inteiro linha por linha
for line in reader:
print(line, end='')
Saída:
Principais linguagens de programacao
JavaScript
Python
Java
Ruby
PHP
C++
C#
Go
C
Essa abordagem final é mais Pythonic e pode ser mais rápida e mais eficiente em termos de memória.
Portanto, é recomendável que você use ela.
Nota: Alguns dos exemplos acima contém print(‘texto qualquer’, end = ”).
O end = ” é para impedir que o Python adicione uma nova linha ao texto que está sendo impresso e imprima apenas o que está sendo lido no arquivo.
Agora vamos ver um pouco sobre gravação de arquivos
Assim como na leitura de arquivos, os objetos de arquivo têm vários métodos úteis para gravar dados em um arquivo.
O .write (string) escreve a string no arquivo.
O .writelines (seq) grava a sequência no arquivo.
Nenhuma finalização de linha é anexada a cada item da sequência.
Cabe a você adicionar os finais de linha apropriados.
Aqui está um exemplo rápido de como usar .write () e .writelines ()
with open('text_input.txt', 'r') as reader:
#Nota: as linhas de leitura não cortam (Trim) as terminações das linhas
languages_list = reader.readlines()
with open('text_input_reversed.txt', 'w') as writer:
#Alternativamente, você pode usar
#writer.writelines(reversed(languages_list))
#Escreve o conteúdo no arquivo em ordem inversa
for languages in reversed(languages_list):
writer.write(languages)
Saída no console:
5
2
3
3
4
4
5
5
7
11
37
Escrevendo no arquivo text_input_reversed.txt o seguinte conteúdo:
SwiftC
Go
C#
C++
PHP
Ruby
Java
Python
JavaScript
Principais linguagens de programacao
Trabalhando com bytes
Às vezes, pode ser necessário trabalhar com arquivos usando cadeias de bytes.
Isso é feito adicionando o caractere ‘b‘ ao argumento mode.
Todos os mesmos métodos para o objeto de arquivo se aplicam.
No entanto, cada um dos métodos espera e retorna um objeto bytes:
with open('text_input.txt', 'rb') as reader:
print(reader.readline())
b'Principais linguagens de programacao\r\n'
Digamos que tenhamos uma foto, vou usar a logo do código fluente para exemplificar, python_logo.png, a mesma que utilizamos anteriormente.
Você pode abrir esse arquivo no Python e examinar o conteúdo!
Como o formato do arquivo .png está bem definido, o cabeçalho do arquivo é dividido em 8 bytes, assim:
Valor | Interpretação |
---|---|
0x89 | Um número “mágico” para indicar que este é o início de um PNG |
0x50 0x4E 0x47 | PNG em ASCII |
0x0D 0x0A | Finalização de linha no estilo DOS \r\n |
0x1A | EOF estilo character DOS |
0x0A | Finalização de linha no estilo Unix\n |
Com certeza, quando você abre o arquivo e lê esses bytes individualmente, pode ver que esse é realmente um arquivo de cabeçalho .png:
with open('python_logo.png', 'rb') as byte_reader:
print(byte_reader.read(1))
print(byte_reader.read(3))
print(byte_reader.read(2))
print(byte_reader.read(1))
print(byte_reader.read(1))
b'\x89'
b'PNG'
b'\r\n'
b'\x1a'
b'\n'
Anexando a um arquivo
Às vezes, convém anexar a um arquivo ou começar a escrever no final de um arquivo já preenchido.
Isso é feito facilmente usando o caractere ‘a‘ para o argumento mode.
with open('text_input.txt', 'a') as a_writer:
a_writer.write('Elixir\n')
O text_input.txt agora tá assim:
Principais linguagens de programacao
JavaScript
Python
Java
Ruby
PHP
C++
C#
Go
C
Swift
Elixir