python - barplot - pandas plot
Leyendo el archivo completo en Python (2)
La respuesta a esa pregunta depende en cierta medida de la implementación particular de Python.
Para comprender de qué se trata todo esto, preste especial atención al objeto de file
real. En su código, ese objeto se menciona solo una vez, en una expresión, y se vuelve inaccesible inmediatamente después de que regresa la llamada read()
.
Esto significa que el objeto de archivo es basura. La única pregunta que queda es "¿Cuándo recogerá el recolector de basura el objeto de archivo?".
en CPython, que usa un contador de referencia, este tipo de basura se detecta de inmediato y, por lo tanto, se recolecta de inmediato. Esto no es generalmente cierto para otras implementaciones de python.
Una mejor solución, para asegurarse de que el archivo está cerrado, es este patrón:
with open(''Path/to/file'', ''r'') as content_file:
content = content_file.read()
que siempre cerrará el archivo inmediatamente después de que finalice el bloque; incluso si se produce una excepción.
Edición: Para poner un punto más fino en él:
Aparte del file.__exit__()
, que se llama "automáticamente" en una configuración de administrador de contexto, la única otra forma en que se llama automáticamente a file.close()
(es decir, que no sea una llamada explícita a usted mismo) es a través del file.__del__()
. Esto nos lleva a la pregunta de cuándo se __del__()
.
Un programa escrito correctamente no puede asumir que los finalizadores se ejecutarán en cualquier momento antes de la finalización del programa.
- http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx
En particular:
Los objetos nunca son destruidos explícitamente; sin embargo, cuando se vuelven inalcanzables, pueden ser recolectados en la basura. Se permite una implementación para posponer la recolección de basura u omitirla por completo . Es una cuestión de calidad de implementación cómo se implementa la recolección de basura, siempre y cuando no se recolecten objetos a los que se pueda acceder.
[...]
CPython actualmente utiliza un esquema de conteo de referencias con (opcional) detección retardada de basura enlazada cíclicamente, que recolecta la mayoría de los objetos tan pronto como se vuelven inalcanzables, pero no se garantiza que recolecte basura que contenga referencias circulares.
- https://docs.python.org/3.5/reference/datamodel.html#objects-values-and-types
(Énfasis mío)
pero como sugiere, otras implementaciones pueden tener otro comportamiento. Como ejemplo, PyPy tiene 6 implementaciones diferentes de recolección de basura .
Si lees un archivo completo con content = open(''Path/to/file'', ''r'').read()
¿el manejador de archivos permanece abierto hasta que el script sale? ¿Hay un método más conciso para leer un archivo completo?
Puedes usar pathlib .
Para Python 3.5 y superior:
from pathlib import Path
contents = Path(file_path).read_text()
Para versiones inferiores de Python use pathlib2 :
$ pip install pathlib2
Entonces:
from pathlib2 import Path
contents = Path(file_path).read_text()
Esta es la implementation real de read_text
:
def read_text(self, encoding=None, errors=None):
"""
Open the file in text mode, read it, and close the file.
"""
with self.open(mode=''r'', encoding=encoding, errors=errors) as f:
return f.read()