función seek ()?

127

Disculpe mi confusión aquí, pero he leído la documentación sobre la función seek () en python (después de tener que usarla) y aunque me ayudó, todavía estoy un poco confundido sobre el significado real de lo que hace, cualquier explicación es muy útil. apreciado, gracias

Gmenfan83
fuente

Respuestas:

234

En cuanto a que seek()no hay mucho de qué preocuparse.

En primer lugar, es útil cuando se opera sobre un archivo abierto.

Es importante tener en cuenta que su sintaxis es la siguiente:

fp.seek(offset, from_what)

¿Dónde fpestá el puntero de archivo con el que está trabajando? offsetsignifica cuántas posiciones moverás; from_whatdefine su punto de referencia:

  • 0 : significa que su punto de referencia es el comienzo del archivo
  • 1 : significa que su punto de referencia es la posición actual del archivo
  • 2 : significa que su punto de referencia es el final del archivo

si se omite, el valor from_whatpredeterminado es 0.

Nunca olvides que al administrar archivos, siempre habrá una posición dentro de ese archivo donde estás trabajando actualmente. Cuando se abre, esa posición es el comienzo del archivo, pero a medida que trabaja con él, puede avanzar.
seekte será útil cuando necesites walkese archivo abierto, como un camino por el que estás viajando.

Nicolás Ozimica
fuente
115
1 para explicar el segundo parámetro, aunque me gustaría añadir que probablemente debería utilizar las constantes os.SEEK_SET, os.SEEK_CURy os.SEEK_ENDen lugar de los números mágicos 0, 1y 2, respectivamente.
ArtOfWarfare
La posición de búsqueda es un índice de bytes en el contenido del archivo similar a un índice de matriz. También es interesante que si abrimos el archivo en modo anexar 'a', no podemos buscar el comienzo del archivo.
anilmwr
3
En realidad, en el caso del modo agregar, podemos buscar el comienzo del archivo usando fp.seek (0, 0), pero tan pronto como intente escribir en ese archivo, la búsqueda se restablecerá nuevamente al final del archivo y el contenido se escribirá al final .
anilmwr
1
Gracias - aprendí algo nuevo y solo tuve que leer esta respuesta claramente explicada
Adam Hughes
cuando se llama a buscar desde el principio del archivo, ¿comienza realmente a 'buscar' desde el principio del archivo cada vez?
Theo Stefou
40

Cuando abre un archivo, el sistema señala el comienzo del archivo. Cualquier lectura o escritura que hagas pasará desde el principio. Una seek()operación mueve ese puntero a otra parte del archivo para que pueda leer o escribir en ese lugar.

Por lo tanto, si desea leer el archivo completo pero omite los primeros 20 bytes, abra el archivo, seek(20)vaya al lugar donde desea comenzar a leer, luego continúe leyendo el archivo.

O digamos que desea leer cada 10 bytes, podría escribir un ciclo que lo haga seek(9, 1)(mueve 9 bytes hacia adelante en relación con las posiciones actuales), read(1)(lee un byte), repita.

DGH
fuente
14
-1: Esta respuesta no explica el segundo parámetro, y en realidad, como está redactado, hace que parezca que el segundo parámetro dicta cuántos bytes se leen.
ArtOfWarfare
3

La seekfunción espera es un desplazamiento en bytes.

Ejemplo de archivo ASCII:

Entonces, si tiene un archivo de texto con el siguiente contenido:

simple.txt

abc

Puedes saltar 1 byte para omitir el primer carácter de la siguiente manera:

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

Ancho de recopilación de ejemplo de archivo 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: Una vez que llama read, está cambiando la posición del cabezal de lectura, que es como actuar seek.

usuario1767754
fuente
0

Para las cadenas, olvídate de usar WHENCE: usa f.seek (0) para colocar al principio del archivo y f.seek (len (f) +1) para colocar al final del archivo. Use abrir (archivo, "r +") para leer / escribir en cualquier parte de un archivo. Si usa "a +", solo podrá escribir (agregar) al final del archivo, independientemente de dónde coloque el cursor.

Gordon Graham
fuente
¿Estás hablando de archivos o cadenas?
RalfFriedl
Perdón por la confusion. Se trata de archivos.
Gordon Graham