funzione seek ()?


127

Per favore, scusa la mia confusione qui, ma ho letto la documentazione relativa alla funzione seek () in Python (dopo averlo dovuto usare) e sebbene mi abbia aiutato, sono ancora un po 'confuso sul significato reale di ciò che fa, ogni spiegazione è molto apprezzato, grazie.

Risposte:


234

Per quanto riguarda seek()non c'è troppo di cui preoccuparsi.

Prima di tutto, è utile quando si opera su un file aperto.

È importante notare che la sua sintassi è la seguente:

fp.seek(offset, from_what)

dov'è fpil puntatore del file con cui stai lavorando; offsetindica quante posizioni ti sposterai; from_whatdefinisce il tuo punto di riferimento:

  • 0 : indica che il punto di riferimento è l' inizio del file
  • 1 : indica che il punto di riferimento è la posizione corrente del file
  • 2 : significa che il punto di riferimento è la fine del file

se omesso, il from_whatvalore predefinito è 0.

Non dimenticare mai che quando si gestiscono i file, ci sarà sempre una posizione all'interno del file su cui si sta attualmente lavorando. Quando è appena aperto, quella posizione è l'inizio del file, ma mentre lavori con esso, puoi avanzare.
seekti sarà utile quando è necessario walklungo quel file aperto, proprio come un percorso in cui stai viaggiando.


115
+1 per spiegare il secondo parametro, anche se mi piacerebbe aggiungere che probabilmente si dovrebbe utilizzare le costanti os.SEEK_SET, os.SEEK_CURe os.SEEK_ENDal posto dei numeri magici 0, 1e 2, rispettivamente.
ArtOfWarfare l'

La posizione di ricerca è un indice di byte nel contenuto del file simile a un indice di array. È anche interessante che se apriamo il file in modalità append "a", non possiamo cercare l'inizio del file.
anilmwr,

3
In realtà in caso di modalità append, possiamo cercare l'inizio del file usando fp.seek (0, 0), ma non appena si tenta di scrivere su quel file, la ricerca si reimposterà nuovamente alla fine del file e il contenuto verrà scritto alla fine .
anilmwr

1
Grazie - ho imparato qualcosa di nuovo e ho dovuto solo leggere queste risposte chiaramente spiegate
Adam Hughes,

quando si chiama cerca dall'inizio del file, inizia effettivamente a "cercare" dall'inizio del file ogni volta?
Theo Stefou,

40

Quando si apre un file, il sistema punta all'inizio del file. Qualsiasi lettura o scrittura che fai accadrà dall'inizio. Un'operazione seek()sposta quel puntatore su un'altra parte del file in modo da poter leggere o scrivere in quel punto.

Quindi, se si desidera leggere l'intero file ma saltare i primi 20 byte, aprire il file seek(20)per passare al punto in cui si desidera iniziare a leggere, quindi continuare con la lettura del file.

Oppure dire che si desidera leggere ogni decimo byte, è possibile scrivere un ciclo che lo fa seek(9, 1)(si sposta di 9 byte in avanti rispetto alle posizioni correnti), read(1)(legge un byte), ripetere.


14
-1: questa risposta non spiega il secondo parametro e in realtà, come espresso, fa sembrare che il secondo parametro imponga quanti byte vengono letti.
ArtOfWarfare l'

3

La seekfunzione prevede un offset in byte.

Esempio di file Ascii:

Quindi se hai un file di testo con il seguente contenuto:

simple.txt

abc

Puoi saltare 1 byte per saltare il primo carattere come segue:

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

Larghezza raccolta esempio file binario:

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]

Nota: quando chiami, readstai cambiando la posizione della testina di lettura, che agisce come seek.


0

Per le stringhe, dimentica di usare WHENCE: usa f.seek (0) per posizionare all'inizio del file e f.seek (len (f) +1) per posizionare alla fine del file. Usa open (file, "r +") per leggere / scrivere ovunque in un file. Se usi "a +" sarai in grado di scrivere (aggiungi) alla fine del file indipendentemente da dove posizioni il cursore.


Stai parlando di file o stringhe?
RalfFriedl,

Dispiace per la confusione. Si tratta di file.
Gordon Graham,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.