Python-Datei Variablen - was ist das?
Ich habe gerade angefangen mit Python, und da mein hintergrund ist mehr low-level-Sprachen (java, C++), ich kann Sie nicht einfach wirklich, bekommen einige Dinge.
So, in python kann man eine Datei erstellen, die variable, durch das öffnen einer text-Datei, zum Beispiel, und dann Durchlaufen Sie seine Zeilen wie diese:
f = open(sys.argv[1])
for line in f:
#do something
Allerdings, wenn ich versuche f[0]
der interpreter gibt eine Fehlermeldung. Also was Struktur hat f
Objekt haben und wie weiß ich im Allgemeinen, wenn ich mich bewerben kann for ... in ... :
Schleife auf ein Objekt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
f
ist ein file-Objekt. Die Dokumentation listet seine Struktur, also werde ich nur erklären die Indizierung/Iteration Verhalten.Objekt ist mit Wendeschneidplatten nur, wenn es implementiert
__getitem__
, die Sie überprüfen können, durch aufrufenhasattr(f, '__getitem__')
oder einfach anrufenf[0]
zu sehen, ob es ein Fehler ausgegeben. In der Tat, das ist genau das, was deine Fehlermeldung sagt:Datei-Objekte sind nicht indizierbar. Sie können rufen Sie
f.readlines()
und zurückgeben einer Liste von Linien, die sich mit Wendeschneidplatten.Objekte implementieren
__iter__
sind iterierbar mit derfor ... in ...
syntax. Nun gibt es tatsächlich zwei Arten von wiederholenden Objekte: container-Objekte und iterator-Objekte. Iterator-Objekte die Implementierung von zwei Methoden:__iter__
und__next__
. Container-Objekte implementieren nur__iter__
- und return ein iterator-Objekt, das ist eigentlich das, was Sie sind, iteriert. Datei-Objekte werden Ihre eigenen Iteratoren, wie Sie beide Methoden implementieren.Wenn Sie wollen, um das nächste Element in einer durchsuchbar, können Sie die
next()
Funktion:Ein Wort der Vorsicht: iterables in der Regel nicht "wiederbewickelbar", so dass, sobald Sie die Fortschritte durch die durchsuchbar sind, können Sie nicht wirklich wieder zurück gehen. Zum "Zurückspulen" eines file-Objekts verwenden, können Sie
f.seek(0)
, wird die aktuelle position wieder auf den Anfang der Datei.1) f ist keine Liste. Gibt es irgendein Buch, tutorial oder eine website, die sagte, Sie f ist eine Liste? Wenn nicht, warum denken Sie, Sie behandeln können f als Liste? Sie sicherlich nicht behandeln können eine Datei in C++ oder Java als array können Sie? Warum nicht?
2) In python eine for-Schleife hat die folgende Dinge:
So
f.__iter__()
können ein Objekt zurückgeben, das zu tun, was es will, wenn next() aufgerufen wird, auf Sie. Es passiert einfach so, dass Guido entschieden, dass das zurückgegebene Objekt durch einef.__iter__()
sollte die Zeilen aus der Datei, wenn deren next () - Methode aufgerufen wird.Wenn das Objekt verfügt über eine
__iter__()
Methode, und die__iter__()
Methode gibt ein Objekt zurück, mit einem next () - Methode, die Sie anwenden können eine for-in-Schleife, um es. Oder in anderen Worten, Sie lernen aus Erfahrung, welche Objekte implementieren die iterator-Protokoll.Dies veranschaulicht den Unterschied zwischen einem Sequenz-Typ, die unterstützt Indizierung, slicing, und beschränkt iteration, und ein iterator-Typ, die keine Unterstützung für die Indizierung oder aufschneiden, aber mehr erweiterte iteration, die Aufrechterhaltung der internen Zustand, um es zu tun.
Einem file-Objekt ist ein Beispiel für die letztere. Sie können extrahieren Sie den Inhalt als Zeilen und speichern Sie in einem Sequenz-Typ (insbesondere die Liste) durch die
readlines
Methode, wie andere haben darauf hingewiesen.In Python, jedes Datenelement ist ein Python-Objekt. Also, was ist zurückgekehrt, um Sie durch
open()
ist ein Objekt; speziell, es ist einfile
- Objekt repräsentiert einen Datei-handle.Wissen Sie bereits, wie dies zu tun:
Dies ist konzeptionell sehr ähnlich wie das äquivalent in C:
In C, ist die einzige nützliche Sache, die Sie tun können, mit, dass
handle
variable ist, um es zu übergeben, um Aufrufe wiefread()
. In Python, das Objekt hat Methode-Funktionen zugeordnet. So, hier ist C zu Lesen 100 bytes aus einer Datei und schließen Sie es dann:Und hier ist äquivalent Python:
Ein guter Weg, um herauszufinden, mehr über Python-Funktionen und-Objekte ist die Verwendung des built-in
help()
Befehl von der Eingabeaufforderung von Python. Versuchenhelp(open)
und es sagt Ihnen nicht viel, aber macht Euch sagen, es gibt ein file-Objekt. So dann Versuchhelp(file)
und nun bekommen Sie eine ganze Menge Informationen. Erfahren Sie mehr über die.close()
Methode.read()
, und andere, wie.readlines()
.Aber die, die verwirrt Sie war, Durchlaufen die handle-Objekt. Da ein sehr häufiger Fall ist, Lesen von Zeilen aus einer Datei, Python macht Datei-handles arbeiten, wie ein iterator, und wenn Sie Durchlaufen, erhalten Sie jeweils eine Zeile aus der Datei.
Liste von Objekten in Python sind beide schwenkbare und iterierbar, so dass, wenn Sie haben eine Liste mit Namen
a
können Sie beides tuna[i]
oderfor x in a:
. Suchen Sie ein Element von der position,a[i]
, ist die Indizierung. Datei-handle-Objekte unterstützen keine Indizierung, sondern unterstützen iteration.In mehreren Antworten hier finden Sie die
with
- Anweisung. Dies ist die beste Praxis in Python. Einwith
- Anweisung funktioniert nur bei einigen Arten von Objekten in Python; die Objekte haben zur Unterstützung ein paar spezielle Methode funktioniert. Alles, was Sie wirklich wissen müssen, um jetzt überwith
ist, dass, wenn Sie können es verwenden, einige notwendige Initialisierung und Finalisierung arbeiten, kann für Sie getan werden. Im Fall des öffnens einer Datei, diewith
Anweisung kümmert schließen Sie die Datei für Sie. Der große Teil ist, dass diewith
- Anweisung wird sichergestellt, dass die Fertigstellung erfolgt, auch wenn der code eine Ausnahme auslöst.Hier idiomatic Python für das obige Beispiel:
Was du suchst ist
readlines
http://docs.python.org/2/library/stdtypes.html#file.readlines.readlines()
ist, dass Sie speichern die gesamte Datei in den Speicher, was nicht immer möglich.Der Grund, Sie sind in der Lage, dies zu tun ist, weil
file object
ist durchsuchbar.Datei variable ist so etwas wie file-handler in C. öffnen Sie es, verarbeiten (Lesen, schreiben) und schließen sich dem Ende.
Dem letzten Beispiel ist besser als
for line in handler.readlines()
, weil die ersten Zeilen gelesen werden, wenn Sie Sie benötigen, und zweitens verbraucht alle Zeilen auf einmal (kann Probleme mit großen Dateien)Können Sie sich immer mit dir(f), um die Struktur von f ,f ist ein file-Objekt
Der Interpreter gibt eine Fehlermeldung
Ihnen sagt, dass der Typ
file
nicht zulassen der Indexierung wief[0]
und so weiter. Wenn ein Typ das Attribut__getitem__
es ermöglicht die Indizierung, sonst ist es nicht. Im Fall von Dateien, ist es die letztere.Können Sie mehr wissen über Dateien aus, indem Sie.
for
- Schleifen können generell angewendet werden, um jede Struktur, die durchsuchbar.Wenn Sie möchten, eine Liste mit Linien, dann kannst du das tun.
Oder tun,
Sobald Sie erstellen Sie f, es ist ein Datei-Objekt. readlines ist einer der file-Objekts Methoden. Die
for line in f.readlines():
startet eine Schleife, die ermöglicht, dass code, den Sie schreiben, um Prozess
line
der Datei zu einem Zeitpunkt. Sie können die for-Schleife, weil das zurückgegebene Objekt aus readlines() ist durchsuchbar.f
brauchen nicht durchsuchbar. Nur das Objekt zurückgegeben, die vonf.readlines()
. Letztlich, beide Objekte iterierbar, aber das ist nicht der Punkt hier.