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ę.

Gmenfan83
źródło

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.

Nicolás Ozimica
źródło
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.

DGH
źródło
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.

user1767754
źródło
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.

Gordon Graham
źródło
Czy mówisz o plikach czy ciągach znaków?
RalfFriedl
Przepraszam za zamieszanie. Chodzi o pliki.
Gordon Graham