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 ébytesem vez destr.
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:
os.listdir()– retorna uma lista de nomes em um diretório.os.remove()– exclui um arquivo.os.rename()– renomeia um arquivo.os.stat()– metadados do arquivo (tamanho, hora de modificação, …).os.mkdir()– cria um novo diretório.
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.