Jetzt benutze ich:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Aber damit der Code besser aussieht, kann ich Folgendes tun:
output = open('pagehead.section.htm','r').read()
Wie schließe ich die Datei bei Verwendung der obigen Syntax, um Systemressourcen freizugeben?
contents = os.readfile(path)
. Wenn ich etwas schickeres machen wollte, dann würde ich es gerne benutzenwith open(path) as fd: contents = fd.read()
. Natürlich kann man einen eigenen Wrapper schreiben, aber dafür ist der Kern gedacht, um Programmierern Abstraktionen zu bieten.Antworten:
Sie müssen es nicht wirklich schließen - Python erledigt dies automatisch entweder während der Speicherbereinigung oder beim Beenden des Programms. Aber wie @delnan bemerkte, ist es aus verschiedenen Gründen besser, es explizit zu schließen.
Was können Sie also tun, um es kurz, einfach und explizit zu halten:
Jetzt sind es nur noch zwei Zeilen und ziemlich lesbar, denke ich.
quelle
with
Anweisung verwenden, wird die Dateiressource für Sie ordnungsgemäß geschlossen.output = f.read()
Teil auf der gleichen Linie , nachdem der:
.Das Python Standard Library Pathlib- Modul macht das, wonach Sie suchen:
Vergessen Sie nicht, Path zu importieren:
Installieren Sie auf Python 27 backported
pathlib
oderpathlib2
quelle
with
sind in Ordnung, aberwith
eine Aussage, kein Ausdruck. Diesepathlib
Antwort ist die einzige Antwort auf die ursprüngliche Frage, die in einen Python-Ausdruck eingebettet werden kann. So etwas wieSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()
Mit CPython wird Ihre Datei sofort nach Ausführung der Zeile geschlossen, da das Dateiobjekt sofort durch Müll gesammelt wird. Es gibt jedoch zwei Nachteile:
In Python-Implementierungen, die sich von CPython unterscheiden, wird die Datei häufig nicht sofort geschlossen, sondern zu einem späteren Zeitpunkt außerhalb Ihrer Kontrolle.
In Python 3.2 oder höher wird ein
ResourceWarning
, wenn aktiviert, ausgelöst.Besser eine zusätzliche Zeile investieren:
Dadurch wird sichergestellt, dass die Datei unter allen Umständen korrekt geschlossen wird.
quelle
Dazu müssen keine speziellen Bibliotheken importiert werden.
Verwenden Sie die normale Syntax und die Datei wird zum Lesen geöffnet und dann geschlossen.
oder
Dies gibt Ihnen ein Array x, das die Zeilen enthält und wie folgt gedruckt werden kann:
Diese Einzeiler sind sehr hilfreich für die Wartung - im Grunde genommen selbstdokumentierend.
quelle
Sie können die
with
Anweisung verwenden und die beiden Schritte in eine Zeile schreiben:Die
with
Anweisung achtet darauf, die__exit__
Funktion des angegebenen Objekts aufzurufen, auch wenn in Ihrem Code etwas Schlimmes passiert ist. Es ist nah an dertry... finally
Syntax. Für Objekt zurückgegeben durchopen
,__exit__
entspricht Datei Schließung.Diese Anweisung wurde mit Python 2.6 eingeführt.
quelle
with
wurde in Python 2.5, eingeführt aber werden mußte explizit importiert aus__future__
. Es wurde in Python 2.6 aus allen Kontexten verfügbar.benutze ilio : (inline io):
Nur ein Funktionsaufruf anstelle der Datei open (), read (), close ().
quelle
quelle
python -c
in der Befehlszeile verwendet werden kann. Daher hilft es nicht, zweizeilige Antworten zu veröffentlichen."
,;
zwei Anweisungen anhängen und danach Zeilenumbrüche löschen können:
? Der folgende Ausdruck funktioniert gut für mich:$> python -c "with open('some file', 'r') as f: print(next(f))"
Ich denke, der natürlichste Weg, dies zu erreichen, besteht darin, eine Funktion zu definieren.
Dann können Sie Folgendes tun:
quelle
Ich mache häufig so etwas, wenn ich ein paar Zeilen um etwas bekommen muss, das ich in einer Protokolldatei erfasst habe:
quelle
grep -A <n>
,grep -B <n>
undgrep -C <n>
, wenn es nützlich ist. Weitere Informationen: stackoverflow.com/a/9083/1830159Mit
more_itertools.with_iter
können Sie ein Äquivalentoutput
in einer Zeile öffnen, lesen, schließen und zuweisen (ohne die Importanweisung):Obwohl dies möglich ist, würde ich nach einem anderen Ansatz suchen als dem Zuweisen des Inhalts einer Datei zu einer Variablen, dh einer verzögerten Iteration. Dies kann mithilfe eines herkömmlichen
with
Blocks oder im obigen Beispiel durch Entfernenjoin()
und Iterieren erfolgenoutput
.quelle
"".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))
Dies funktioniert einwandfrei und macht eine Zeile für den Import überflüssig.Wenn Sie dieses warme und verschwommene Gefühl wollen, gehen Sie einfach mit .
Für Python 3.6 habe ich diese beiden Programme unter einem Neuanfang von IDLE ausgeführt und dabei folgende Laufzeiten angegeben:
Also kein großer Unterschied.
AUSGABE:
AUSGABE:
quelle