Módulo Python IO: A Referência Prática Completa

Olá a todos! No artigo de hoje, vamos analisar a utilização do Módulo Python IO.

Este módulo é bastante útil quando se pretende realizar operações I/O relacionadas com ficheiros (por exemplo. leitura/escrita de ficheiros)

Enquanto pode usar o normal read() e write() métodos de leitura/escrita de um ficheiro, este módulo dá-nos muito mais flexibilidade relativamente a estas operações.

Para compreender mais sobre este módulo, tomemos alguns exemplos.

Módulo Python IO

Este módulo faz parte da biblioteca padrão, pelo que não há necessidade de o instalar separadamente utilizando pip.

Para importar o módulo io, podemos fazer o seguinte:

import io

No módulo io há 2 classes comuns que são muito úteis para nós:

  • BytesIO -> operações I/O sobre dados de bytes
  • StringIO -> operações I/O sobre dados de cordas

Podemos aceder a estas classes usando io.BytesIO e io.StringIO.

Vamos dar uma vista de olhos uma a uma.

Classe Python BytesIO

Aqui, podemos manter os nossos dados sob a forma de bytes (b''). Quando utilizamos io.BytesIO, os dados são mantidos num buffer in-memory.

Podemos obter uma instância para o fluxo de bytes utilizando o construtor:

import iobytes_stream = io.BytesIO(b'Hello from Journaldev\x0AHow are you?')

Notificação de que estamos a passar uma cadeia de bytes (prefixada utilizando b).

P>Posto de direito, bytes_stream é simplesmente um cabo para o fluxo de bytes.

Para imprimir realmente os dados dentro do buffer, precisamos de usar bytes_stream.getvalue().

import iobytes_stream = io.BytesIO(b'Hello from Journaldev\x0AHow are you?')print(bytes_stream.getvalue())

Here, getvalue() retira o valor da cadeia de bytes do cabo.

Desde que a cadeia de bytes \x0A é a representação ASCII da nova linha (‘\n’), obtemos a seguinte saída:

Saída

b'Hello from Journaldev\nHow are you?'

Agora, é sempre uma boa prática fechar o nosso cabo tampão sempre que tivermos feito o nosso trabalho.

É também para nos certificarmos de que libertamos qualquer memória que tenhamos atribuído para o tampão.

Para fechar o buffer, use:

bytes_stream.close()

Agora vamos olhar para a classe StringIO.

Classe Python StringIO

Similiar a io.BytesIO, a classe io.StringIO pode ler dados relacionados com stringIO a partir de um buffer StringIO.

import iostring_stream = io.StringIO("Hello from Journaldev\nHow are you?")

Podemos ler a partir do buffer de cordas usando string_stream.read() e escrever usando string_stream.write(). Isto é muito semelhante à leitura / escrita a partir de um ficheiro!

Podemos imprimir o conteúdo usando getvalue().

Output

Initially, buffer: Hello from JournaldevHow are you?Finally, buffer: This will overwrite the old content of the buffer if the length of this string exceeds the old content

Desde que estejamos a escrever no mesmo buffer, o novo conteúdo irá obviamente sobregravar o antigo!

Leitura a partir de um buffer StringIO

Similiar à escrita, também podemos ler a partir de um buffer StringIO usando buffer.read().

import ioinput = io.StringIO('This goes into the read buffer.')print(input.read())

Output

This goes into the read buffer.

Como pode ver, o conteúdo está agora dentro do buffer de leitura, que é impresso usando buffer.read().

Leitura de um ficheiro usando io

Podemos usar o método io.open() para ler directamente a partir de um ficheiro também, semelhante à leitura a partir de um objecto de ficheiro.

Aqui, este módulo dá-nos a opção de leitura tamponada vs não tamponada.

Por exemplo, o seguinte utilizará uma leitura tamponada para ler um ficheiro, definindo buffering = SIZE. Se SIZE = 0, isto não implicará qualquer efeito tampão!

Suppose sample.txt tem o seguinte conteúdo:

Hello from JournalDev!How are you?This is the last line.

Output

b'Hello from JournalDev!\nHow are you?\nThis is the last line.\n'

Como pode ver, o ficheiro foi lido com sucesso! Aqui, io lerá o ficheiro utilizando um tamanho de buffer de aproximadamente 5 bytes.

Utilizando io.open() vs os.open()

O io.A função open() é uma forma muito preferida de executar operações I/O, pois é feita como uma interface pitónica de alto nível.

Pelo contrário, a função os.open() irá executar uma chamada de sistema para a função open(). Isto devolverá um descritor de ficheiro, que não pode ser usado como o io manipular objecto.

Desde que io.open() é uma função de invólucro para os.open(), é geralmente boa prática usar tais funções de invólucro, uma vez que tratam automaticamente de muitos erros para si.

Conclusão

Neste artigo, aprendemos a usar o módulo Python IO, e são duas classes principais – io.BytesIO e io.StringIO para ler e escrever byte e dados de string num buffer.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *