fungsi seek ()?


127

Maafkan kebingungan saya di sini tetapi saya telah membaca dokumentasi mengenai fungsi seek () di python (setelah harus menggunakannya) dan meskipun itu membantu saya, saya masih agak bingung tentang arti sebenarnya dari apa yang dilakukannya, penjelasannya banyak. dihargai, terima kasih.

Jawaban:


234

Mengenai seek()tidak terlalu banyak yang perlu dikhawatirkan.

Pertama-tama, ini berguna saat mengoperasikan file yang terbuka.

Penting untuk diperhatikan bahwa sintaksnya adalah sebagai berikut:

fp.seek(offset, from_what)

di mana fppenunjuk file yang Anda gunakan; offsetberarti berapa banyak posisi yang akan Anda pindahkan; from_whattentukan titik acuan Anda:

  • 0 : berarti titik referensi Anda adalah awal file
  • 1 : Berarti titik referensi Anda adalah posisi file saat ini
  • 2 : artinya titik referensi Anda adalah akhir file

jika dihilangkan, from_whatdefaultnya adalah 0.

Jangan pernah lupa bahwa saat mengelola file, akan selalu ada posisi di dalam file yang sedang Anda kerjakan. Saat baru dibuka, posisi itu adalah awal file, tetapi saat Anda mengerjakannya, Anda dapat maju.
seekakan berguna bagi Anda saat Anda perlu menggunakan walkfile yang terbuka itu, seperti jalur yang Anda tuju.


115
1 untuk menjelaskan parameter kedua, meskipun saya ingin menambahkan bahwa Anda mungkin harus menggunakan konstanta os.SEEK_SET, os.SEEK_CURdan os.SEEK_ENDbukan nomor ajaib 0, 1dan 2, masing-masing.
ArtOfWarfare

Posisi pencarian adalah indeks byte ke dalam konten file yang mirip dengan indeks array. Menarik juga bahwa jika kita membuka file dalam mode append 'a', kita tidak dapat mencari awal file.
anilmwr

3
Sebenarnya dalam mode append, kita dapat mencari awal file menggunakan fp.seek (0, 0), tetapi segera setelah Anda mencoba menulis ke file itu, seek akan mengatur ulang ke akhir file dan konten akan ditulis di akhir .
anilmwr

1
Terima kasih - mempelajari sesuatu yang baru dan hanya perlu membaca jawaban yang dijelaskan dengan jelas ini
Adam Hughes

saat memanggil seek dari awal file, apakah itu benar-benar mulai 'mencari' dari awal file setiap saat?
Theo Stefou

40

Saat Anda membuka file, sistem akan menunjuk ke awal file. Setiap membaca atau menulis yang Anda lakukan akan terjadi sejak awal. Sebuah seek()operasi memindahkan penunjuk tersebut ke bagian lain dari file sehingga Anda bisa membaca atau menulis di tempat itu.

Jadi, jika Anda ingin membaca seluruh file tetapi melewati 20 byte pertama, buka file tersebut, seek(20)untuk pindah ke tempat Anda ingin mulai membaca, lalu lanjutkan dengan membaca file.

Atau katakanlah Anda ingin membaca setiap 10 byte, Anda dapat menulis loop yang melakukannya seek(9, 1)(bergerak 9 byte ke depan relatif ke posisi saat ini), read(1)(membaca satu byte), ulangi.


14
-1: Jawaban ini gagal menjelaskan parameter kedua, dan sebenarnya, seperti yang diutarakan, membuatnya terdengar seperti parameter kedua menentukan berapa banyak byte yang dibaca.
ArtOfWarfare

3

The seekFungsi berharap menjadi mengimbangi dalam bytes.

Contoh File Ascii:

Jadi jika Anda memiliki file teks dengan konten berikut:

simple.txt

abc

Anda dapat melompat 1 byte untuk melewati karakter pertama sebagai berikut:

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

Contoh file biner lebar pengumpulan:

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]

Catatan: Setelah Anda menelepon readAnda mengubah posisi read-head, yang bertindak seperti itu seek.


0

Untuk string, lupakan tentang menggunakan WHENCE: gunakan f.seek (0) ke posisi di awal file dan f.seek (len (f) +1) ke posisi di akhir file. Gunakan open (file, "r +") untuk membaca / menulis di mana saja dalam file. Jika Anda menggunakan "a +", Anda hanya dapat menulis (menambahkan) di akhir file di mana pun Anda meletakkan kursor.


Apakah Anda berbicara tentang file atau string?
RalfFriedl

Maaf bila membingungkan. Ini semua tentang file.
Gordon Graham
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.