Em relação à minha pergunta anterior , notei que nas duas respostas que usavam a open()
função, não havia menção de fechar o arquivo.
Eu li que é uma boa prática fazê-lo, mas há realmente alguma necessidade? É apenas código desnecessário?
O arquivo é fechado automaticamente?
with open (file_name, ...) as variable:
invoca automaticamente oclose()
método assim que você sai desse bloco de código.python3
, o arquivo é visualizado automaticamente automaticamente, uma vez que não possui mais referências.Respostas:
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:
close()
método de umfile
objeto explicitamente ou implicitamente, deixando umwith open(...):
bloco. Isso funciona, é claro, sempre e em qualquer implementação do Python.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!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.fonte
python3
não existe mais e a resposta está desatualizada. A coleta automática de lixo existe por um motivo e funciona perfeitamente. Faz anos desde que eu useiclose()
especificamente. Nunca nunca funcionou em um único erro causado por não utilizá-lo.