Lire uniquement la première ligne d'un fichier?

210

Comment obtiendriez-vous uniquement la première ligne d'un fichier sous forme de chaîne avec Python?

harpals
la source
4
Si vous avez déjà lu le fichier ("Après avoir lu un fichier"), vous avez déjà lu la première ligne! (En supposant qu'il y ait au moins une ligne.)
William Pursell
3
Notez que la question telle qu'elle est libellée a une signification différente de celle qu'elle avait à l'origine. Certaines réponses semblent maintenant idiotes car elles prenaient en compte la partie "après lecture d'un fichier" (qui a été supprimée).
Peter Hansen

Réponses:

355

Utilisez la .readline()méthode ( python 2 documents , python 3 docs ):

with open('myfile.txt') as f:
    first_line = f.readline()

Quelques notes:

  1. Comme indiqué dans la documentation, à moins qu'il ne s'agisse de la seule ligne du fichier, la chaîne renvoyée f.readline()contiendra une nouvelle ligne de fin. Vous souhaiterez peut-être utiliser à la f.readline().strip()place pour supprimer la nouvelle ligne.
  2. L' withinstruction ferme automatiquement le fichier à la fin du bloc.
  3. le with instruction ne fonctionne que dans Python 2.5 et versions ultérieures, et dans Python 2.5 vous devez utiliserfrom __future__ import with_statement
  4. Dans Python 3, vous devez spécifier l'encodage de fichier pour le fichier que vous ouvrez. Lire la suite...
Tor Valamo
la source
3
En Python 3, si le fichier est ascii ou utf8, vous n'avez pas besoin de spécifier l'encodage du fichier. Et si ce n'est pas le cas, vous devez de toute façon spécifier l'encodage à codecs.open en Python 2.
Evpok
2
@Evpok "En Python 3 si le fichier est ascii ou utf8, vous n'avez pas besoin de spécifier l'encodage du fichier" - si seulement c'était strictement vrai! La réalité est un peu plus désordonnée; comme indiqué dans les documents, l'encodage par défaut utilisé dépend de la plate-forme (et peut même différer sur le même ordinateur selon la façon dont vous lancez Python - par exemple, j'ai vu du code qui fonctionnait sur mon shell normal en supposant qu'UTF-8 explose plus tard lors de l'exécution via Apache avec mod_wsgi).
Mark Amery
21
infile = open('filename.txt', 'r')
firstLine = infile.readline()
Jaelebi
la source
17
Vous ne fermez pas le fichier. La solution avecwith est meilleure.
Becko
20
fline=open("myfile").readline().rstrip()
ghostdog74
la source
Je suis venu ici pour chercher ça. D'autant plus que rstrip()supprime le caractère de nouvelle ligne.
Shashank Sawant
5
-1; cela ne ferme pas le fichier et renvoie un résultat incorrect si la première ligne contient des espaces de fin en plus du caractère de retour à la ligne lui-même.
Mark Amery
@MarkAmery: En fait, comme le descripteur de fichier n'est pas affecté à une variable, il est immédiatement récupéré, ce qui ferme le fichier. (Bien que, bien sûr, la solution acceptée utilisant un gestionnaire de contexte soit encore bien meilleure.)
acdr
@acdr Ce que vous dites est vrai pour CPython mais pas pour les autres implémentations de Python - voir par exemple les documents de récupération de place PyPy qui mentionnent comme un point d'intérêt particulier que les "fichiers ... ne sont pas fermés rapidement lorsqu'ils sortent du champ d'application" . Pour cette raison, il est généralement soutenu (par exemple, sur stackoverflow.com/a/7396043/1709587 ) que de se fier au comportement que vous décrivez est une mauvaise pratique.
Mark Amery
9

Cela devrait le faire:

f = open('myfile.txt')
first = f.readline()
Jarret Hardie
la source
9

Pour revenir au début d'un fichier ouvert, puis renvoyer la première ligne, procédez comme suit:

my_file.seek(0)
first_line = my_file.readline()
dan-gph
la source
1
Juste pour mieux comprendre, ce serait "my_file.seek (0) line = my_file.readline ()"
Alberto Perez le
7
first_line = next(open(filename))
hoju
la source
1
Est-ce que cela ferme également le fichier?
abalter
Finalement, lorsque Python quitte le bloc.
vy32
6

Beaucoup d'autres réponses ici, mais pour répondre précisément à la question que vous avez posée (avant que @MarkAmery ne modifie la question d'origine et n'en change le sens):

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

En d'autres termes, si vous avez déjà lu le fichier (comme vous l'avez dit) et que vous avez un gros bloc de données en mémoire, alors pour en obtenir la première ligne efficacement, faites un split () sur le caractère de nouvelle ligne, une fois uniquement et prenez le premier élément de la liste résultante.

Notez que cela n'inclut pas le \ncaractère à la fin de la ligne, mais je suppose que vous ne le voulez pas de toute façon (et un fichier sur une seule ligne peut même ne pas en avoir). Notez également que bien qu'il soit assez court et rapide, il fait une copie des données, donc pour une très grande quantité de mémoire, vous ne pouvez pas le considérer comme "efficace". Comme toujours, cela dépend ...

Peter Hansen
la source
8
S'il s'agit d'un gros fichier, f.read () essaiera de charger l'intégralité du fichier en mémoire, ce qui ne serait pas une bonne idée. Une alternative serait de lire un caractère à la fois jusqu'à ce qu'une nouvelle ligne ou un EOF soit rencontré
randomThought
En fait, toutes les autres réponses sont de meilleures alternatives que cela. Normalement, la lecture d'un fichier avec readline () et des amis chargerait des blocs entiers à la fois, peut-être 32K donner ou prendre, et rechercher à travers cela pour trouver la prochaine nouvelle ligne. Beaucoup plus rapide et plus efficace. Ma réponse ne serait utile que s'il charge déjà tout, auquel cas nous pouvons supposer qu'il est d'accord pour tout avoir en mémoire.
Peter Hansen
2
Je ne suis pas convaincu d'avoir changé le sens. Cela n'a pas beaucoup de sens de demander comment "lire" la première ligne d'un fichier après avoir "lu" tout le fichier. En tant que tel, il est assez évident pour moi que l'intention du demandeur n'était pas de supposer que cela .read()doit être appelé en premier.
Mark Amery
@MarkAmery, la question était mal formulée ("assez dénuée de sens"), vous avez donc deviné l'intention ("évidente pour moi") et reformulée pour qu'elle corresponde. Mon interprétation diffère. Clairement jusqu'à ce que et à moins que les harpals ne clarifient, tout ce que nous avons, c'est le libellé original plus son acceptation d'une réponse (c'est-à-dire "rechercher (0)") qui, pour moi, montre clairement qu'il avait déjà lu dans le dossier, au moins au-delà de la première ligne.
Peter Hansen
vous devez supprimer cette réponse. ce n'est pas la bonne façon et peut tromper les gens.
thang
-15
f1 = open("input1.txt", "r")
print(f1.readline())
Zwon
la source
20
Il existe plusieurs réponses de plus de cinq ans contenant exactement cette approche . Vous ne faites que créer du bruit en en ajoutant un autre.
Mark Amery