declaraciones de anidación 'con' en Python
-
22-09-2019 - |
Pregunta
Resulta que "con" es una palabra divertida para buscar en Internet.
¿Alguien sabe cuál es el trato con el encaje en declaraciones en Python?
He estado rastreando un error muy resbaladizo en un script que he estado escribiendo y sospecho que es porque estoy haciendo esto:
with open(file1) as fsock1:
with open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
Python vomita cuando intento read()
de fsock2. Tras una inspección en el depurador, esto es porque se piensa que el archivo está vacío. Esto no sería preocupante excepto por el hecho de que la ejecución de exactamente el mismo código en la depuración interperter ni en un with
espectáculos declaración me que el archivo es, de hecho, bastante completa de texto ...
Me voy a partir del supuesto de que para los estados with
ahora anidación es un no-no, pero si hay alguien que sabe más tiene una opinión diferente, me encantaría escucharlo.
Solución
He encontrado la solución en el documento de pitón. Es posible que desee echar un vistazo a este rel="noreferrer"> (3 Python) este (Python 2)
Si está ejecutando Python 2.7+ se puede utilizar de esta manera:
with open(file1) as fsock1, open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
De este modo, evitar la sangría innecesaria.
Otros consejos
Que yo sepa no se puede leer un archivo abierto con 'a'
modalidad de apertura.
Tras una inspección en el depurador, esto es porque se piensa que el archivo está vacío.
creo que esto sucede porque en realidad no puede leer nada. Incluso si se pudiera, cuando se anexa a un archivo, el puntero se mueve buscan al final del archivo, en preparación para la escritura de que se produzca.
Estas declaraciones with
funciona bien para mí:
with open(file1) as f:
with open(file2, 'r') as g: # Read, not append.
fstring1 = f.read()
fstring2 = g.read()
Tenga en cuenta que el uso de contextlib.nested
, como sugirió otro cartel, es potencialmente cargado de peligro aquí. Digamos que usted hace esto:
with contextlib.nested(open(file1, "wt"), open(file2)) as (f_out, f_in):
...
Los gestores de contexto aquí se crean uno a la vez. Eso significa que si la apertura de fichero2 falla (por ejemplo, debido a que no existe), entonces no será capaz de finalización adecuadamente archivo1 y vas a tener que dejarlo hasta el recolector de basura. Eso es, potencialmente, una cosa muy mala.
No hay ningún problema con las declaraciones de anidación with
-. Bien, estás file2
apertura para añadir, por lo que no se puede leer de él
Si no les gusta with
declaraciones de anidación, por cualquier razón, a menudo se puede evitar que con la contextlib.nested función. código sin embargo, no va a hacer roto (por ejemplo, el código que abre un archivo de datos anexados y luego trata de leerlo en su lugar) de trabajo, ni declaraciones with
léxico de anidación romper el código que es de otra manera bueno.
En cuanto a la búsqueda de "con", anteponiendo una palabra con '+' impide que Google ignorarlo.