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.