2.27. Leitura e escrita

Os ficheiros residem em disco; o Python acede-lhes através de open(), que devolve um objeto ficheiro cujos métodos leem e escrevem os bytes subjacentes.

2.27.1. open e modos

O primeiro argumento é o caminho; o segundo é o modo – uma string curta que diz ao Python como o ficheiro será usado:

  • "r" – leitura (predefinição). Abre um ficheiro existente para leitura.

  • "w" – escrita. Cria um novo ficheiro ou trunca um existente para vazio.

  • "a" – acrescentar. Abre um ficheiro para escrita no seu final sem truncar.

  • "b" acrescentado a qualquer dos anteriores ("rb", "wb", "ab") – modo binário. O conteúdo do ficheiro é bytes em vez de str.

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. Usar um gestor de contexto

O padrão acima deixa escapar o identificador de ficheiro se algo entre open() e close lançar. A solução é a instrução with (veja gestores de contexto):

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

Esta é a forma padrão – escreva-a assim sempre.

2.27.3. Leitura

Os objetos ficheiro suportam vários estilos de leitura:

  • io.IOBase.read() – lê o ficheiro inteiro (ou N bytes) e devolve-o como uma única string (ou objeto bytes).

  • io.IOBase.readline() – lê uma linha, incluindo o "\n" final.

  • Iterar o ficheiro diretamente produz linhas uma de cada vez, com muito menor uso de memória do que ler o ficheiro inteiro de uma vez.

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip() remove a nova linha final antes de imprimir para que a saída não fique com espaço duplo.

2.27.4. Escrita

Abra o ficheiro no modo "w" e use io.IOBase.write():

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() não adiciona uma nova linha – escreve exatamente os bytes (ou caracteres, em modo de texto) que lhe são fornecidos.

2.27.5. Texto vs binário

O modo de texto (predefinição, "r" / "w" sem "b") descodifica os bytes recebidos em str usando uma codificação predefinida, e codifica o str de saída de volta para bytes. Use-o para configuração, registos, JSON – qualquer coisa que seja texto.

O modo binário ("rb" / "wb") salta o passo de descodificação e devolve bytes. Use-o para imagens, registos compactados com struct, capturas de rede – qualquer coisa onde cada byte importa e o ficheiro não é legível por humanos.

2.27.6. Listar e remover ficheiros

O módulo os expõe as operações do sistema de ficheiros que não estão no objeto ficheiro em si:

import os

for name in os.listdir("/"):
    print(name)

Capture OSError em torno destas operações quando o ficheiro ou diretório pode não estar presente – a operação é um dos lugares comuns onde as exceções aparecem em scripts reais.