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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top