2.27. Leitura e gravação

Arquivos ficam no disco; o Python os alcança por meio de open(), que retorna um objeto de arquivo cujos métodos leem e gravam 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 arquivo será usado:

  • "r" – leitura (padrão). Abre um arquivo existente para leitura.

  • "w" – gravação. Cria um novo arquivo ou trunca um existente, deixando-o vazio.

  • "a" – acréscimo. Abre um arquivo para gravação no seu final, sem truncá-lo.

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

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

2.27.2. Use um gerenciador de contexto

O padrão acima vaza o identificador do arquivo se qualquer coisa entre open() e close lançar uma exceção. A correção é a instrução with (veja gerenciadores 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 todas as vezes.

2.27.3. Leitura

Objetos de arquivo suportam vários estilos de leitura:

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

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

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

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

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

2.27.4. Gravação

Abra o arquivo 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 quebra de linha – ele grava exatamente os bytes (ou caracteres, no modo texto) que você fornece.

2.27.5. Texto vs binário

O modo texto (padrão, "r" / "w" sem "b") decodifica os bytes recebidos em str usando uma codificação padrão, e codifica a str enviada de volta em bytes. Use-o para configuração, logs, JSON – qualquer coisa que seja texto.

O modo binário ("rb" / "wb") pula a etapa de decodificação e retorna bytes. Use-o para imagens, registros empacotados com struct, capturas de rede – qualquer coisa em que cada byte importe e o arquivo não seja legível por humanos.

2.27.6. Listando e removendo arquivos

O módulo os expõe as operações de sistema de arquivos que não estão no próprio objeto de arquivo:

import os

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

Capture OSError em torno dessas operações quando o arquivo ou diretório pode não existir – a operação é um dos lugares comuns onde exceções aparecem em scripts reais.