Aula 20 – Python – Biblioteca Padrão – Módulo IO

Aula 20 – Python – Biblioteca Padrão – Módulo I/O

Python - I/O Ferramentas para streams

Python – I/O Ferramentas para streams

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:

Curso Python Bot

Curso Python Bot

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:

ValorInterpretação
0x89Um número “mágico” para indicar que este é o início de um PNG
0x50 0x4E 0x47PNG em ASCII
0x0D 0x0AFinalização de linha no estilo DOS \r\n
0x1AEOF estilo character DOS
0x0AFinalizaçã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

Foi adicionado no final do arquivo a linguagem Elixir.

É isso, vimos bastante coisas sobre módulo I/O, ficamos por aqui. 😉

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

Obrigado, até a próxima e bons estudos. 🙂

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>