Quando os arquivos são fechados?
Como podemos aprender com O fechamento explícito de arquivos é importante? (StackOverflow) , o interpretador Python fecha o arquivo nos seguintes casos:
- você invoca manualmente o
close()
método de um file
objeto explicitamente ou implicitamente, deixando um with open(...):
bloco. Isso funciona, é claro, sempre e em qualquer implementação do Python.
- a
file
última referência do objeto foi removida e, portanto, o objeto é processado pelo Garbage Collector. Este não é um recurso de linguagem, mas apenas um recurso especial da implementação do CPython, portanto, para portabilidade, não dependa disso!
- o intérprete Python termina. Nesse caso, ele deve fechar todos os identificadores de arquivo que foram abertos. Algumas versões mais antigas do Python3 também teriam impresso um aviso de que você deveria tê-las fechado manualmente. No entanto, imagine uma falha ou você force a morte do interpretador Python e verá que isso também não é confiável.
Portanto, apenas o primeiro método (manual) é confiável!
O que aconteceria se um arquivo permanecesse aberto?
Primeiro, dependendo da implementação do seu interpretador Python, se você abriu um arquivo com acesso de gravação, não pode ter certeza de que suas modificações foram liberadas no disco até que você o induza manualmente ou o manipulador de arquivos seja fechado.
Segundo, você pode abrir apenas um número limitado de arquivos no seu sistema por usuário. Se você exceder esse limite, por exemplo, abrindo muitos arquivos em um loop no seu programa Python sem fechá-los o mais rápido possível, o sistema pode se recusar a abrir mais identificadores de arquivos para você e você receberá uma exceção. Também pode acontecer que seu programa pegue o último arquivo aberto permitido e outro programa falhe porque é recusado.
Terceiro, os arquivos abertos em um dispositivo removível impedem que seja desmontado ou ejetado. Você ainda pode excluir o arquivo em alguns sistemas de arquivos como ext4
, onde simplesmente o descritor / link físico para o inode do arquivo é removido / desvinculado, mas o programa que abriu o arquivo ainda pode acessar o inode através de seu próprio manipulador de arquivos temporário. Este é, por exemplo, também o mecanismo que permite atualizar pacotes enquanto o respectivo software está em execução. No entanto, por exemplo, o NTFS não possui esse recurso. No entanto, ele nunca pode ser modificado por dois processos simultâneos, portanto ainda será bloqueado para outros.
with open (file_name, ...) as variable:
invoca automaticamente oclose()
método assim que você sai desse bloco de código.