função seek ()?


127

Por favor, desculpe minha confusão aqui, mas eu li a documentação referente à função seek () em python (depois de ter que usá-la) e, embora tenha me ajudado, ainda estou um pouco confuso com o significado real do que faz, quaisquer explicações são muito apreciado, obrigado.

Respostas:


233

No seek()que diz respeito não há muito com que se preocupar.

Primeiro de tudo, é útil ao operar sobre um arquivo aberto.

É importante observar que sua sintaxe é a seguinte:

fp.seek(offset, from_what)

onde fpestá o ponteiro do arquivo com o qual você está trabalhando; offsetsignifica quantas posições você se moverá; from_whatdefine seu ponto de referência:

  • 0 : significa que seu ponto de referência é o início do arquivo
  • 1 : significa que seu ponto de referência é a posição atual do arquivo
  • 2 : significa que seu ponto de referência é o final do arquivo

se omitido, o from_whatpadrão é 0.

Nunca se esqueça de que, ao gerenciar arquivos, sempre haverá uma posição dentro desse arquivo em que você está trabalhando no momento. Quando aberta, essa posição é o início do arquivo, mas, ao trabalhar com ele, você pode avançar.
seekserá útil quando você precisar walkacompanhar o arquivo aberto, exatamente como o caminho para o qual está viajando.


115
+1 para explicar o segundo parâmetro, embora eu gostaria de acrescentar que você provavelmente deve usar as constantes os.SEEK_SET, os.SEEK_CURe, os.SEEK_ENDem vez dos números mágicos 0, 1e 2, respectivamente.
ArtOfWarfare 11/11/14

A posição de busca é um índice de bytes no conteúdo do arquivo, semelhante a um índice de matriz. Também é interessante que, se abrirmos o arquivo no modo de acréscimo 'a', não podemos procurar o início do arquivo.
Anilmwr

3
Na verdade, no caso do modo de acréscimo, podemos procurar o início do arquivo usando fp.seek (0, 0), mas assim que você tentar gravar nesse arquivo, o seek será redefinido novamente no final do arquivo e o conteúdo será gravado no final .
Anilmwr

1
Obrigado - aprendi algo novo e só tive que ler esta resposta claramente explicada
Adam Hughes

ao chamar a busca desde o início do arquivo, ele realmente começa a 'procurar' a partir do início do arquivo toda vez?
Theo Stefou

40

Quando você abre um arquivo, o sistema aponta para o início do arquivo. Qualquer leitura ou gravação que você fizer acontecerá desde o início. Uma seek()operação move esse ponteiro para outra parte do arquivo, para que você possa ler ou escrever nesse local.

Portanto, se você quiser ler o arquivo inteiro, mas pular os primeiros 20 bytes, abra o arquivo seek(20)para ir para onde deseja começar a ler e continue lendo o arquivo.

Ou diga que você quer ler cada 10 bytes, você pode escrever um loop que faz seek(9, 1)(move 9 bytes para frente em relação às posições atuais) read(1)(lê um byte), repita.


14
-1: Essa resposta falha ao explicar o segundo parâmetro e, na verdade, como é formulado, faz parecer que o segundo parâmetro determina quantos bytes são lidos.
ArtOfWarfare 11/11/14

3

A seekfunção espera é um deslocamento em bytes.

Exemplo de arquivo Ascii:

Portanto, se você tiver um arquivo de texto com o seguinte conteúdo:

simple.txt

abc

Você pode pular 1 byte para pular o primeiro caractere da seguinte maneira:

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

Exemplo de arquivo binário que reúne a largura:

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: Depois de ligar, readvocê altera a posição do cabeçote de leitura, que funciona como se fosse seek.


0

Para strings, esqueça de usar WHENCE: use f.seek (0) para posicionar no início do arquivo e f.seek (len (f) +1) para posicionar no final do arquivo. Use open (arquivo, "r +") para ler / gravar em qualquer lugar do arquivo. Se você usar "a +", poderá escrever (acrescentar) no final do arquivo, independentemente de onde posicionar o cursor.


Você está falando sobre arquivos ou strings?
RalfFriedl

Desculpe pela confusão. É tudo sobre arquivos.
Gordon Graham
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.