seek () işlevi?


127

Lütfen buradaki kafa karışıklığımı affedin, ancak python'daki arama () işlevi ile ilgili belgeleri okudum (kullanmak zorunda kaldıktan sonra) ve bana yardımcı olmasına rağmen, ne yaptığının gerçek anlamı konusunda hala biraz kafam karıştı, herhangi bir açıklama çok fazla teşekkür ederim.

Yanıtlar:


234

ilişkin seek() hakkında endişe çok fazla bir şey yok.

Her şeyden önce, açık bir dosya üzerinde çalışırken kullanışlıdır.

Söz diziminin aşağıdaki gibi olduğuna dikkat etmek önemlidir:

fp.seek(offset, from_what)

fpbirlikte çalıştığınız dosya tanıtıcısı nerede ; offsetkaç pozisyon hareket edeceğiniz anlamına gelir; from_whatreferans noktanızı tanımlar:

  • 0 : referans noktanızın dosyanın başlangıcı olduğu anlamına gelir
  • 1 : referans noktanızın geçerli dosya konumu olduğu anlamına gelir
  • 2 : referans noktanızın dosyanın sonu olduğu anlamına gelir

atlanırsa, from_whatvarsayılan değer 0'dır.

Dosyaları yönetirken, o dosyanın içinde her zaman şu anda üzerinde çalıştığınız bir konum olacağını asla unutmayın. Sadece açıldığında, bu konum dosyanın başlangıcıdır, ancak onunla çalışırken ilerleyebilirsiniz. tıpkı girdiğiniz yol gibi, o açık dosya boyunca
seekihtiyacınız olduğunda sizin için yararlı olacaktır walk.


115
Ben muhtemelen sabitleri kullanması gerektiğini eklemek istediğiniz rağmen, ikinci parametreyi açıklayan +1 os.SEEK_SET, os.SEEK_CURve os.SEEK_ENDyerine sihirli sayılar 0, 1ve 2sırasıyla.
ArtOfWarfare

Arama konumu, bir dizi dizinine benzer şekilde dosyanın içeriğinin bayt dizinidir. Ayrıca, dosyayı 'a' ekleme modunda açarsak, dosyanın başlangıcını arayamayacağımız da ilginçtir.
anilmwr

3
Aslında ekleme modu durumunda, fp.seek (0, 0) kullanarak dosyanın başlangıcını arayabiliriz, ancak bu dosyaya yazmaya çalıştığınız anda, seek yeniden dosyanın sonuna sıfırlanacak ve içerik sonunda yazılacaktır. .
anilmwr

1
Teşekkürler - yeni bir şey öğrendim ve sadece bu açıkça açıklanan cevabı okumak zorunda kaldılar
Adam Hughes

Dosyanın başından arama çağrıldığında, aslında her seferinde dosyanın başlangıcından 'aramaya' başlıyor mu?
Theo Stefou

40

Bir dosyayı açtığınızda, sistem dosyanın başlangıcına işaret eder. Yaptığınız her okuma veya yazma en baştan gerçekleşecektir. birseek() işlem bu işaretçiyi dosyanın başka bir bölümüne taşır, böylece o yerde okuyabilir veya yazabilirsiniz.

Bu nedenle, tüm dosyayı okumak istiyor ancak ilk 20 baytı atlamak istiyorsanız, dosyayı açın, seek(20)okumaya başlamak istediğiniz yere gitmek için dosyayı okumaya devam edin.

Veya her 10 baytta bir okumak istediğinizi söyleyin, bunu yapan seek(9, 1)(mevcut konumlara göre 9 bayt ileri hareket eden), read(1)(bir bayt okur), tekrar eden bir döngü yazabilirsiniz .


14
-1: Bu cevap, ikinci parametreyi açıklamakta başarısız olur ve aslında ifade edildiği gibi, ikinci parametrenin kaç bayt okunduğunu belirlediği gibi ses çıkarır.
ArtOfWarfare

3

Beklenen seekişlev , bayt cinsinden bir uzaklıktır .

Ascii Dosyası Örneği:

Dolayısıyla, aşağıdaki içeriğe sahip bir metin dosyanız varsa:

simple.txt

abc

Aşağıdaki gibi ilk karakteri atlamak için 1 bayt atlayabilirsiniz:

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

İkili dosya örneği toplama genişliği:

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]

Not: Bir kez aradığınızda read, okuma kafasının pozisyonunu değiştiriyorsunuz, bu da buna benzer seek.


0

Dizeler için WHENCE'ı kullanmayı unutun: dosyanın başlangıcına konumlandırmak için f.seek (0) ve dosyanın sonuna konumlandırmak için f.seek (len (f) +1) kullanın. Bir dosyanın herhangi bir yerinde okumak / yazmak için open (file, "r +") kullanın. "A +" kullanırsanız, imleci nereye yerleştirdiğinize bakılmaksızın yalnızca dosyanın sonuna yazabilirsiniz (ekleme).


Dosyalardan mı yoksa dizelerden mi bahsediyorsunuz?
RalfFriedl

Karışıklık için özür dilerim. Her şey dosyalar hakkında.
Gordon Graham
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.