2012-11-07 19 views
6

Jeśli mam jakiś obiekt plikopodobny i wykonaj następujące czynności:Jak działa funkcja wyszukiwania Pythona?

F = open('abc', 'r') 
... 
loc = F.tell() 
F.seek(loc-10) 

Czego szukać zrobić? Czy zaczyna się na początku pliku i czyta loc-10 bajtów? Czy jest wystarczająco inteligentny, aby utworzyć kopię zapasową 10 bajtów?

Odpowiedz

9

Jest to specyficzne dla OS i biblioteki libc. Operacja file.seek() jest delegowana do wywołania fseek(3) C dla rzeczywistych plików na poziomie systemu operacyjnego.

+0

Czy ta platforma i implementacja są zależne? – jlconlin

+0

Tak, z implementacją podzieloną między libc i OS. –

+0

Czy jest to możliwe/łatwe do zrobienia bez rozpoczynania pracy od początku pliku? – jlconlin

4

Powinien być wystarczająco inteligentny, aby po prostu utworzyć kopię zapasową 10 bajtów, ale przypuszczam, że szczegóły naprawdę zależą od używanej biblioteki systemów plików/OS/runtime.

Pamiętaj, że jeśli chcesz utworzyć kopię zapasową 10 bajtów, nie ma potrzeby, aby tell.

F.seek(-10,1) 
+0

Dzięki za udostępnienie tego. Jest to znacznie prostsza implementacja niż podałem jako mój przykład. – jlconlin

8

Według Python 2.7's docs:

file.seek(offset[, whence])

Ustaw aktualną pozycję pliku, podobnie jak fseek stdio za(). Argument jest opcjonalny i domyślnie jest ustawiony na os.SEEK_SET lub 0 (bezwzględny plik pozycjonowanie); pozostałe wartości to os.SEEK_CUR lub 1 (szukanie w stosunku do aktualnej pozycji ) i os.SEEK_END lub 2 (wyszukiwanie w stosunku do końca pliku ).

Mów co chcesz iść 10 bajtów tyłu w stosunku do swojej pozycji:

file.seek(-10, 1) 
-4

zgodnie z dokumentacją, trzeba zrobić f.seek(offset, from_what), lub w przypadku, F.seek(-10, loc)

swój przykład powinien zadziałać, ale jest to bardziej jednoznaczne.

+4

Jest to dość mylące. Ta odpowiedź działa tylko wtedy, gdy 'loc' ma wartość 1. – mgilson