Chercher () fonction?

127

Veuillez excuser ma confusion ici mais j'ai lu la documentation concernant la fonction seek () en python (après avoir eu à l'utiliser) et bien que cela m'ait aidé, je suis encore un peu confus sur la signification réelle de ce qu'elle fait, toutes les explications sont beaucoup apprécié, merci.

Gmenfan83
la source

Réponses:

234

En seek()ce qui concerne il n'y a pas trop de soucis.

Tout d'abord, il est utile lorsque vous opérez sur un fichier ouvert.

Il est important de noter que sa syntaxe est la suivante:

fp.seek(offset, from_what)

fpest le pointeur de fichier avec lequel vous travaillez; offsetsignifie combien de positions vous allez déplacer; from_whatdéfinit votre point de référence:

  • 0 : signifie que votre point de référence est le début du fichier
  • 1 : signifie que votre point de référence est la position actuelle du fichier
  • 2 : signifie que votre point de référence est la fin du fichier

si omis, la valeur par from_whatdéfaut est 0.

N'oubliez jamais que lors de la gestion de fichiers, il y aura toujours une position dans ce fichier sur laquelle vous travaillez actuellement. Lorsqu'elle est simplement ouverte, cette position est le début du fichier, mais à mesure que vous travaillez avec elle, vous pouvez avancer.
seekvous sera utile lorsque vous en aurez besoin le walklong de ce fichier ouvert, tout comme un chemin dans lequel vous voyagez.

Nicolás Ozimica
la source
115
+1 pour expliquer le second paramètre, bien que je voudrais ajouter que vous devriez probablement utiliser les constantes os.SEEK_SET, os.SEEK_CURet au os.SEEK_ENDlieu des numéros magiques 0, 1et 2, respectivement.
ArtOfWarfare
La position de recherche est un index d'octet dans le contenu du fichier similaire à un index de tableau. Il est également intéressant de noter que si nous ouvrons un fichier en mode d'ajout «a», nous ne pouvons pas chercher au début du fichier.
anilmwr
3
En fait, en cas de mode d'ajout, nous pouvons rechercher le début du fichier en utilisant fp.seek (0, 0), mais dès que vous essayez d'écrire dans ce fichier, la recherche sera à nouveau réinitialisée à la fin du fichier et le contenu sera écrit à la fin .
anilmwr
1
Merci - a appris quelque chose de nouveau et n'a eu qu'à lire cette réponse clairement expliquée une fois
Adam Hughes le
lors de l'appel de la recherche depuis le début du fichier, commence-t-il réellement à «rechercher» à partir du début du fichier à chaque fois?
Theo Stefou
40

Lorsque vous ouvrez un fichier, le système pointe vers le début du fichier. Toute lecture ou écriture que vous effectuez se fera depuis le début. Une seek()opération déplace ce pointeur vers une autre partie du fichier afin que vous puissiez lire ou écrire à cet endroit.

Donc, si vous voulez lire le fichier entier mais ignorez les 20 premiers octets, ouvrez le fichier, seek(20)pour aller là où vous voulez commencer la lecture, puis continuez avec la lecture du fichier.

Ou disons que vous voulez lire tous les 10 octets, vous pouvez écrire une boucle qui fait seek(9, 1)(avance de 9 octets par rapport aux positions actuelles), read(1)(lit un octet), répète.

DGH
la source
14
-1: Cette réponse ne parvient pas à expliquer le second paramètre, et en fait, tel que formulé, donne l'impression que le second paramètre dicte le nombre d'octets lus.
ArtOfWarfare
3

La seekfonction attend un décalage en octets.

Exemple de fichier Ascii:

Donc, si vous avez un fichier texte avec le contenu suivant:

simple.txt

abc

Vous pouvez sauter d' un octet pour sauter le premier caractère comme suit:

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

Exemple de fichier binaire regroupant la largeur:

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]

Remarque: une fois que vous appelez, readvous changez la position de la tête de lecture, qui agit comme seek.

user1767754
la source
0

Pour les chaînes, oubliez d'utiliser WHENCE: utilisez f.seek (0) pour positionner au début du fichier et f.seek (len (f) +1) pour positionner à la fin du fichier. Utilisez open (file, "r +") pour lire / écrire n'importe où dans un fichier. Si vous utilisez "a +", vous ne pourrez écrire (ajouter) qu'à la fin du fichier, quel que soit l'endroit où vous positionnez le curseur.

Gordon Graham
la source
Parlez-vous de fichiers ou de chaînes?
RalfFriedl
Désolé pour la confusion. Tout est question de fichiers.
Gordon Graham