Pour un exercice que je fais, j'essaye de lire le contenu d'un fichier donné deux fois en utilisant la read()
méthode. Étrangement, lorsque je l'appelle la deuxième fois, il ne semble pas renvoyer le contenu du fichier sous forme de chaîne?
Voici le code
f = f.open()
# get the year
match = re.search(r'Popularity in (\d+)', f.read())
if match:
print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())
if matches:
# matches is always None
Bien sûr, je sais que ce n'est pas le moyen le plus efficace ou le meilleur, ce n'est pas le but ici. Le fait est que je ne peux pas appeler read()
deux fois? Dois-je réinitialiser le descripteur de fichier? Ou fermer / rouvrir le fichier pour ce faire?
Réponses:
L'appel
read()
lit le fichier entier et laisse le curseur de lecture à la fin du fichier (sans plus rien à lire). Si vous cherchez à lire un certain nombre de lignes à la fois , vous pouvez utiliserreadline()
,readlines()
ou itérer à travers les lignes avecfor line in handle:
.Pour répondre directement à votre question, une fois qu'un fichier a été lu,
read()
vous pouvez utiliserseek(0)
pour ramener le curseur de lecture au début du fichier (les documents sont ici ). Si vous savez que le fichier ne sera pas trop volumineux, vous pouvez également enregistrer laread()
sortie dans une variable, en l'utilisant dans vos expressions findall.Ps. N'oubliez pas de fermer le fichier une fois que vous en avez terminé;)
la source
with
.ouais, comme ci-dessus ...
j'écrirai juste un exemple:
la source
Tous ceux qui ont répondu à cette question jusqu'à présent ont tout à fait raison -
read()
parcourent le fichier, donc après l'avoir appelé, vous ne pouvez plus le rappeler.Ce que j'ajouterai, c'est que dans votre cas particulier, vous n'avez pas besoin de chercher au début ou de rouvrir le fichier, vous pouvez simplement stocker le texte que vous avez lu dans une variable locale et l'utiliser deux fois, ou autant de fois que vous le souhaitez, dans votre programme:
la source
from pathlib import Path; text = Path(filename).read_text()
Prend soin d'ouvrir, de fermer, etc.Le pointeur de lecture se déplace après le dernier octet / caractère lu. Utilisez la
seek()
méthode pour rembobiner le pointeur de lecture au début.la source
Chaque fichier ouvert a une position associée.
Lorsque vous lisez (), vous lisez à partir de cette position. Par exemple,
read(10)
lit les 10 premiers octets d'un fichier nouvellement ouvert, puis un autreread(10)
lit les 10 octets suivants.read()
sans arguments lit tout le contenu du fichier, laissant la position du fichier à la fin du fichier. La prochaine fois que vous appelez,read()
il n'y a rien à lire.Vous pouvez utiliser
seek
pour déplacer la position du fichier. Ou probablement mieux dans votre cas serait d'en faire unread()
et de conserver le résultat pour les deux recherches.la source
read()
consomme . Ainsi, vous pouvez réinitialiser le fichier ou chercher au début avant de le relire. Ou, si cela correspond à votre tâche, vous pouvez utiliserread(n)
pour ne consommer que desn
octets.la source
Je trouve toujours que la méthode de lecture ressemble à une promenade dans une ruelle sombre. Vous descendez un peu et vous vous arrêtez mais si vous ne comptez pas vos pas, vous ne savez pas à quel point vous en êtes. Seek donne la solution en repositionnant, l'autre option est Tell qui renvoie la position le long du fichier. Peut-être que l'api du fichier Python peut combiner lecture et recherche dans un read_from (position, octets) pour le rendre plus simple - jusqu'à ce que cela se produise, vous devriez lire cette page .
la source