In Ruby können Sie mit aus einer Datei lesen s = File.read(filename)
. Das kürzeste und klarste, das ich in Python kenne, ist
with open(filename) as f:
s = f.read()
Gibt es eine andere Möglichkeit, die es noch kürzer (vorzugsweise eine Zeile) und lesbarer macht?
Hinweis: Anfangs habe ich die Frage als "dies in einer einzigen Codezeile tun" formuliert. Wie S.Lott betonte, bedeutet kürzer nicht unbedingt besser lesbar. Also habe ich meine Frage umformuliert, um klar zu machen, was ich meinte. Ich denke, der Ruby-Code ist besser und besser lesbar, nicht unbedingt, weil er eine Zeile gegen zwei ist (obwohl das auch wichtig ist), sondern auch, weil er eine Klassenmethode ist, im Gegensatz zu einer Instanzmethode, die keine Frage darüber aufwirft, wer die Datei schließt. So stellen Sie sicher, dass es geschlossen wird, auch wenn eine Ausnahme ausgelöst wird usw. Wie in den folgenden Antworten angegeben, können Sie sich darauf verlassen, dass der GC Ihre Datei schließt (was dies zu einem Einzeiler macht), aber das macht den Code noch schlimmer obwohl es kürzer ist. Nicht nur, indem man nicht portierbar ist, sondern indem man es unklar macht.
with
Anweisung in 2.5). Vielleicht gibt es einen Weg, vielleicht gibt es keinen. Ich kann immer versuchen, es herauszufinden, oder? Wenn es dir nicht gefällt, stimme ab und gehe weiter. :)File.readlines("filename")
ist, dass der Inhalt einer Datei unter ihrem Namen gelesen wird. Es gibt kein Dateihandle, keinen Deskriptor oder kein Objekt im Beweis. Alle Python-Äquivalente, die ich gesehen habe, enthalten ein explizites Öffnen / Schließen (oder schlimmer noch, ein implizites Öffnen, das ein explizites Schließen erfordert).Antworten:
Wenn Sie bereit sind, Bibliotheken zu verwenden, installieren Sie den Forked -Path (entweder mit easy_install oder pip).
Dann können Sie tun:
from path import path s = path(filename).bytes()
Diese Bibliothek ist ziemlich neu, aber sie ist ein Zweig einer Bibliothek, die seit Jahren in Python herumschwirrt und ziemlich oft verwendet wird. Seit ich diese Bibliothek vor Jahren gefunden habe, benutze ich sie sehr selten
os.path
oderopen()
nicht mehr.quelle
0777
anstelle von0o0777
), wird von meiner aktuellen Python-Version nicht unterstützt.with open('x.py') as f: s = f.read()
*** grinst ***
quelle
Dies ist das gleiche wie oben, behandelt jedoch keine Fehler:
s = open(filename, 'r').read()
quelle
Verwenden Sie Pathlib .
Python 3.5 und höher:
from pathlib import Path contents = Path(file_path).read_text()
Verwenden Sie für niedrigere Versionen von Python pathlib2 :
Dann
from pathlib2 import Path contents = Path(file_path).read_text()
Schreiben ist genauso einfach:
Path(file_path).write_text('my text')
quelle
contents = open(filename).read()
quelle
open(...)
Müll gesammelt wird, denke ich. Jemand korrigiert mich, wenn ich falsch liege.Das ist nicht Perl; Sie möchten keinen Code im Wert von mehreren Zeilen zwangsweise in eine einzelne Zeile einfügen. Schreiben Sie eine Funktion, und beim Aufrufen der Funktion wird eine Codezeile benötigt.
def read_file(fn): """ >>> import os >>> fn = "/tmp/testfile.%i" % os.getpid() >>> open(fn, "w+").write("testing") >>> read_file(fn) 'testing' >>> os.unlink(fn) >>> read_file("/nonexistant") Traceback (most recent call last): ... IOError: [Errno 2] No such file or directory: '/nonexistant' """ with open(fn) as f: return f.read() if __name__ == "__main__": import doctest doctest.testmod()
quelle
Langsam, hässlich, plattformspezifisch ... aber einzeilig ;-)
import subprocess contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]
quelle
So einfach ist das:
f=open('myfile.txt') s=f.read() f.close()
Und mach was du willst mit den Inhalten "s"
quelle
contents = open(filename)
Dies gibt Ihnen einen Generator, so dass Sie die Werte jedoch irgendwo speichern müssen, oder
contents = [line for line in open(filename)]
Dadurch ist das Speichern zum expliziten Schließen der Liste dann nicht möglich (zumindest mit meinen Python-Kenntnissen).
quelle
with
Fall ist). Dies ist nicht möglich, da es nach Abschluss der Iteration weiterhin gültig ist, die Datei zu suchen und erneut mit dem Lesen zu beginnen. Dies würde nicht funktionieren, wenn die Iteration die Datei schließen würde.