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