É fechar um arquivo depois de abri-lo com `open ()` necessário no Python? [fechadas]


9

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?


1
with open (file_name, ...) as variable:invoca automaticamente o close()método assim que você sai desse bloco de código.
Byte Commander

1
Duplicação entre sites do stackoverflow.com/q/7395542/4464570
Byte Commander

@ByteCommander deseja dar seu comentário como resposta, para tornar esta questão 'resolvida'?
TellMeWhy

1
Em python3, o arquivo é visualizado automaticamente automaticamente, uma vez que não possui mais referências.
Jacob Vlijm

4
Estou votando para fechar esta questão como fora de tópico, porque é uma pergunta geral sobre Python sem conexão com scripts no Ubuntu. está perguntando sobre as melhores práticas em uma linguagem de programação.
Ter23 /

Respostas:


9

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 fileobjeto 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.


Não é inteiramente verdade para python3 !!
23615 Jacob Vlijm

@JacobVlijm Você se importaria de explicar isso?
Byte Commander

Veja o comentário abaixo da pergunta. A resposta sobre "não é uma boa prática" no link da sua resposta é de 2011. Se já existiu, o aviso python3nã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 usei close()especificamente. Nunca nunca funcionou em um único erro causado por não utilizá-lo.
23615 Jacob Vlijm

Então ... Você sabe se outras implementações como PyPy, Jython ou IronPython fecham arquivos da mesma forma que o CPython? E se eu matasse o intérprete, não teria a chance de fechar o arquivo, certo? E também acho que o limite de arquivos abertos ainda se aplica. E quanto à liberação de dados escritos? Você sabe algo mais atualizado lá?
Byte Commander

1
@JacobVlijm Obrigado pela dica. : P Minha máquina já travou ao criar esse arquivo ... Eu nem precisava do Python para isso.
Byte Commander
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.