Schachteln 'MIT' Aussagen in Python
Es stellt sich heraus, dass "mit" ist ein lustiges Wort für die Suche im internet.
Wer weiß, was ist der deal mit Verschachtelung von Aussagen in python?
Ich habe das aufspüren einer sehr rutschigen Fehler in einem Skript habe ich geschrieben, und ich vermute, dass es ist, weil ich das hier mache:
with open(file1) as fsock1:
with open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
Python wirft, wenn ich versuche, zu read()
aus fsock2. Nach der Inspektion in den debugger, das ist, weil es denkt, die Datei ist leer. Dies wäre nicht bedenklich, außer der Tatsache, dass die Ausführung der exakt gleiche code in die debugging-interperter nicht in einem with
Aussage zeigt mir, dass die Datei ist, in der Tat, ganz voller text...
Werde ich gehen davon aus, dass für jetzt Verschachtelung with
Aussagen ist ein no-no, aber wenn wer mehr weiß hat eine andere Meinung, ich würde es gerne hören.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Lösung in python-doc. Möchten Sie vielleicht einen Blick auf dieses (Python 3) oder dieses (Python 2)
Wenn Sie mit python 2.7+ Sie können es verwenden, wie diese:
Diese Art und Weise vermeiden Sie unnötige Einzug.
AFAIK, die Sie nicht Lesen können, eine Datei öffnen mit append-Modus
'a'
.Ich denke das passiert, weil es kann nicht wirklich etwas zu Lesen. Selbst wenn Sie es könnten, wenn Sie Anhängen, um eine Datei, die seek-Zeiger am Ende der Datei in Vorbereitung für das schreiben auftreten.
Diese
with
Aussagen gut funktionieren für mich:Beachten Sie, dass die Verwendung von
contextlib.nested
, wie andere poster vorgeschlagen haben, ist möglicherweise voller Gefahr hier. Lassen Sie uns sagen, Sie dies tun:Kontext-Manager bekommen hier erstellt ein zu einer Zeit. Das bedeutet, dass, wenn das öffnen von Datei2 ausfällt (sagen wir, weil es nicht existiert), dann werden Sie nicht in der Lage, richtig abschließen Datei1 und Sie ' ll haben, es zu verlassen, bis der garbage collector. Das ist potenziell eine Sehr Schlechte Sache.
Ist es kein problem mit der Verschachtelung
with
Aussagen-eher, Sie öffnenfile2
für append, also kann man nicht Lesen.Wenn Sie nicht mögen Schachteln
with
Aussagen, aus welchem Grund auch immer, können Sie oft verhindern, dass mit der contextlib.geschachtelte Funktion. Jedoch, es wird nicht gebrochen-code (z.B. code, der öffnet eine Datei zum anfügen und dann versucht, es zu Lesen statt) arbeiten, noch lexikalisch Schachtelnwith
- Anweisungen break-code, der ansonsten gut.Als auch für die Suche nach "mit", indem ein Wort mit '+' werden google verhindern, ihn zu ignorieren.
"with"
.