funkcja seek ()?


127

Proszę wybaczyć moje zamieszanie, ale przeczytałem dokumentację dotyczącą funkcji seek () w Pythonie (po tym, jak jej użyłem) i chociaż pomogło mi to nadal jestem trochę zdezorientowany co do rzeczywistego znaczenia tego, co robi, wszelkich wyjaśnień jest dużo doceniane, dziękuję.

Odpowiedzi:


234

Jeżeli chodzi o seek() nie ma tam zbyt wiele się martwić.

Przede wszystkim przydaje się przy operowaniu na otwartym pliku.

Należy zauważyć, że jego składnia jest następująca:

fp.seek(offset, from_what)

gdzie fpjest wskaźnik pliku, z którym pracujesz; offsetoznacza, o ile pozycji się przesuniesz; from_whatokreśla Twój punkt odniesienia:

  • 0 : oznacza, że ​​punktem odniesienia jest początek pliku
  • 1 : oznacza, że ​​punktem odniesienia jest bieżąca pozycja pliku
  • 2 : oznacza, że ​​punktem odniesienia jest koniec pliku

jeśli pominięte, from_whatdomyślnie 0.

Nigdy nie zapominaj, że podczas zarządzania plikami zawsze będzie miejsce w tym pliku, nad którym aktualnie pracujesz. Po otwarciu ta pozycja jest początkiem pliku, ale podczas pracy z nim możesz przejść do przodu.
seekprzyda ci się, gdy będziesz musiał przejść przez walkten otwarty plik, tak jak ścieżka, do której podróżujesz.


115
+1 dla wyjaśnienia drugi parametr, chociaż chciałbym dodać, że powinieneś używać stałych os.SEEK_SET, os.SEEK_CURi os.SEEK_ENDzamiast magii liczb 0, 1i 2, odpowiednio.
— ArtOfWarfare

Pozycja wyszukiwania to indeks bajtowy zawartości pliku podobny do indeksu tablicy. Interesujące jest również to, że jeśli otworzymy plik w trybie dopisywania „a”, nie możemy szukać początku pliku.
— anilmwr

3
Właściwie w przypadku trybu dołączania możemy szukać początku pliku używając fp.seek (0, 0), ale jak tylko spróbujesz zapisać do tego pliku, seek ponownie zresetuje się do końca pliku, a zawartość zostanie zapisana na końcu .
— anilmwr

1
Dzięki - dowiedziałem się czegoś nowego i musiałem tylko przeczytać tę jasno wyjaśnioną odpowiedź
— Adam Hughes

gdy wywołujesz funkcję seek od początku pliku, czy faktycznie zaczyna „szukać” od początku pliku za każdym razem?
— Theo Stefou

40

Po otwarciu pliku system wskazuje początek pliku. Każde przeczytanie lub napisanie nastąpi od samego początku. A seek()porusza operacja że wskaźnik do innej części pliku, dzięki czemu można czytać i pisać w tym miejscu.

Tak więc, jeśli chcesz przeczytać cały plik, ale pominąć pierwsze 20 bajtów, otwórz plik, seek(20)aby przejść do miejsca, w którym chcesz rozpocząć czytanie, a następnie kontynuuj czytanie pliku.

Lub powiedz, że chcesz czytać co 10 bajt, możesz napisać pętlę, która seek(9, 1)(przesuwa o 9 bajtów do przodu w stosunku do bieżących pozycji), read(1)(czyta jeden bajt), powtórzy.


14
-1: Ta odpowiedź nie wyjaśnia drugiego parametru, a właściwie, zgodnie z wyrażeniem, sprawia, że ​​brzmi to tak, jakby drugi parametr dyktował, ile bajtów jest odczytywanych.
— ArtOfWarfare

3

seekFunkcja spodziewać się dodatkowych przesunięcie w bajtach.

Przykład pliku Ascii:

Więc jeśli masz plik tekstowy z następującą zawartością:

simple.txt

abc

Możesz przeskoczyć o 1 bajt, aby pominąć pierwszy znak w następujący sposób:

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

Przykład zbierania szerokości pliku binarnego:

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]

Uwaga: gdy zadzwonisz read, zmieniasz położenie głowicy odczytującej, co działa podobnie seek.


0

W przypadku łańcuchów zapomnij o używaniu WHENCE: użyj f.seek (0), aby ustawić na początku pliku i f.seek (len (f) +1), aby ustawić go na końcu pliku. Użyj open (plik, "r +"), aby czytać / pisać w dowolnym miejscu pliku. Jeśli użyjesz „a +”, będziesz mógł pisać (dodawać) tylko na końcu pliku, niezależnie od tego, gdzie ustawisz kursor.


Czy mówisz o plikach czy ciągach znaków?
— RalfFriedl

Przepraszam za zamieszanie. Chodzi o pliki.
— Gordon Graham
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.