seek () Funktion?


126

Bitte entschuldigen Sie meine Verwirrung hier, aber ich habe die Dokumentation zur Funktion seek () in Python gelesen (nachdem ich sie verwenden musste) und obwohl es mir geholfen hat, bin ich immer noch ein bisschen verwirrt über die tatsächliche Bedeutung dessen, was es tut, sind alle Erklärungen viel geschätzt, danke.

Antworten:


232

In Bezug auf seek()gibt es nicht zu viel zu befürchten.

Erstens ist es nützlich, wenn Sie über eine geöffnete Datei arbeiten.

Es ist wichtig zu beachten, dass die Syntax wie folgt lautet:

fp.seek(offset, from_what)

Wo fpist der Dateizeiger, mit dem Sie arbeiten? offsetbedeutet, wie viele Positionen Sie verschieben werden; from_whatdefiniert Ihren Bezugspunkt:

  • 0 : bedeutet, dass Ihr Referenzpunkt der Anfang der Datei ist
  • 1 : bedeutet, dass Ihr Referenzpunkt die aktuelle Dateiposition ist
  • 2 : bedeutet, dass Ihr Referenzpunkt das Ende der Datei ist

Wenn nicht angegeben, wird from_whatstandardmäßig 0 verwendet.

Vergessen Sie niemals, dass sich beim Verwalten von Dateien immer eine Position in dieser Datei befindet, an der Sie gerade arbeiten. Wenn diese Position gerade geöffnet ist, ist sie der Anfang der Datei. Wenn Sie jedoch damit arbeiten, können Sie fortfahren.
seekwird für Sie nützlich sein, wenn Sie walkdiese geöffnete Datei als Pfad verwenden müssen, in den Sie sich begeben.


115
1 den zweiten Parameter zur Erläuterung, obwohl ich hinzufügen möchte , dass Sie wahrscheinlich die Konstanten verwenden sollten os.SEEK_SET, os.SEEK_CURund os.SEEK_ENDstatt der magischen Zahlen 0, 1und 2, respectively.
ArtOfWarfare

Die Suchposition ist ein Byte-Index für den Inhalt der Datei, ähnlich einem Array-Index. Es ist auch interessant, dass wir, wenn wir die Datei im Anhänge-Modus 'a' öffnen, nicht nach dem Anfang der Datei suchen können.
Anilmwr

3
Im Append-Modus können wir mit fp.seek (0, 0) nach dem Beginn der Datei suchen. Sobald Sie jedoch versuchen, in diese Datei zu schreiben, wird die Suche erneut auf das Dateiende zurückgesetzt und der Inhalt wird am Ende geschrieben .
Anilmwr

1
Danke - habe etwas Neues gelernt und musste nur diese klar erklärten Antworten lesen
Adam Hughes

Wenn Sie search vom Anfang der Datei aufrufen, beginnt es dann tatsächlich jedes Mal vom Anfang der Datei an zu suchen?
Theo Stefou

40

Wenn Sie eine Datei öffnen, zeigt das System auf den Anfang der Datei. Jedes Lesen oder Schreiben, das Sie tun, geschieht von Anfang an. Eine seek()Operation verschiebt diesen Zeiger auf einen anderen Teil der Datei, damit Sie an dieser Stelle lesen oder schreiben können.

Wenn Sie also die gesamte Datei lesen möchten, aber die ersten 20 Bytes überspringen möchten, öffnen Sie die Datei, seek(20)um zu der Stelle zu gelangen, an der Sie mit dem Lesen beginnen möchten, und fahren Sie dann mit dem Lesen der Datei fort.

Oder sagen Sie, Sie möchten jedes 10. Byte lesen, Sie könnten eine Schleife schreiben, die seek(9, 1)(9 Bytes vorwärts relativ zu den aktuellen Positionen vorwärts bewegt) read(1)(ein Byte liest), wiederholt.


14
-1: Diese Antwort erklärt den zweiten Parameter nicht und lässt es tatsächlich so klingen, als ob der zweite Parameter vorschreibt, wie viele Bytes gelesen werden.
ArtOfWarfare

3

Die seekFunktion erwartet einen Offset in Bytes.

Beispiel für eine Ascii-Datei:

Wenn Sie also eine Textdatei mit folgendem Inhalt haben:

simple.txt

abc

Sie können 1 Byte springen , um das erste Zeichen wie folgt zu überspringen:

fp = open('simple.txt', 'r')
fp.seek(1)
print fp.readline()
>>> bc

Beispiel für das Sammeln von Binärdateien:

fp = open('afile.png', 'rb')
fp.seek(16)
print 'width: {0}'.format(struct.unpack('>i', fp.read(4))[0])
print 'height: ', struct.unpack('>i', fp.read(4))[0]

Hinweis: Sobald Sie anrufen read, ändern Sie die Position des Lesekopfs, die sich wie folgt verhält seek.


0

Vergessen Sie bei Zeichenfolgen die Verwendung von WHENCE: Verwenden Sie f.seek (0), um am Anfang der Datei zu positionieren, und f.seek (len (f) +1), um am Ende der Datei zu positionieren. Verwenden Sie open (Datei, "r +"), um irgendwo in einer Datei zu lesen / schreiben. Wenn Sie "a +" verwenden, können Sie nur am Ende der Datei schreiben (anhängen), unabhängig davon, wo Sie den Cursor positionieren.


Sprechen Sie über Dateien oder Zeichenfolgen?
RalfFriedl

Entschuldigung für die Verwirrung. Es geht nur um Dateien.
Gordon Graham
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.