¿Leer solo la primera línea de un archivo?


210

¿Cómo obtendría solo la primera línea de un archivo como una cadena con Python?


44
Si ya ha leído el archivo ("Después de leer en un archivo"), ¡ya ha leído la primera línea! (Suponiendo que haya al menos una línea.)
William Pursell

3
Tenga en cuenta que la pregunta como está redactada ahora tiene un significado diferente del que tenía originalmente. Algunas respuestas ahora parecen tontas ya que tomaron en cuenta la parte "después de leer en un archivo" (que se ha eliminado).
Peter Hansen el

Respuestas:


355

Use el .readline()método ( documentos de Python 2 , documentos de Python 3 ):

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

Algunas notas:

  1. Como se señala en los documentos, a menos que sea la única línea en el archivo, la cadena devuelta f.readline()contendrá una nueva línea final. Es posible que desee utilizar f.readline().strip()en su lugar para eliminar la nueva línea.
  2. La withdeclaración cierra automáticamente el archivo nuevamente cuando finaliza el bloque.
  3. La withdeclaración solo funciona en Python 2.5 y versiones posteriores, y en Python 2.5 necesita usarfrom __future__ import with_statement
  4. En Python 3, debe especificar la codificación del archivo que abre. Lee mas...

3
En Python 3 si el archivo es ascii o utf8, no tiene que especificar la codificación del archivo. Y si no es así, debe especificar la codificación a codecs.open en Python 2 de todos modos.
Evpok

2
@Evpok "En Python 3 si el archivo es ascii o utf8, no tiene que especificar la codificación del archivo" , ¡si eso fuera estrictamente cierto! La realidad es un poco más desordenada; Como se señaló en los documentos, la codificación predeterminada utilizada depende de la plataforma (y puede diferir incluso en la misma computadora dependiendo de cómo inicie Python; por ejemplo, he visto código que funcionaba en mi shell normal suponiendo que UTF-8 explotara más tarde) cuando se ejecuta a través de Apache con mod_wsgi).
Mark Amery


20
fline=open("myfile").readline().rstrip()

Vine aquí buscando esto. Sobre todo porque rstrip()elimina el carácter de nueva línea.
Shashank Sawant

55
-1; esto no cierra el archivo y devuelve un resultado incorrecto si la primera línea contiene espacios en blanco al final además del carácter de nueva línea.
Mark Amery

@ MarkAmery: en realidad, debido a que el identificador de archivo no está asignado a una variable, es basura recolectada de inmediato, lo que cierra el archivo. (Aunque, por supuesto, la solución aceptada usando un administrador de contexto es aún mucho mejor.)
acdr

@acdr Lo que usted dice es cierto para CPython pero no para otras implementaciones de Python; consulte, por ejemplo, los documentos de recolección de basura de PyPy que mencionan como un punto de interés particular que "los archivos ... no se cierran rápidamente cuando están fuera de alcance" . Por esta razón, generalmente se argumenta (por ejemplo, en stackoverflow.com/a/7396043/1709587 ) que confiar en el comportamiento que usted describe es una mala práctica.
Mark Amery el


9

Para volver al comienzo de un archivo abierto y luego devolver la primera línea, haga lo siguiente:

my_file.seek(0)
first_line = my_file.readline()

1
Solo para comprender mejor, sería "my_file.seek (0) line = my_file.readline ()"
Alberto Perez

7
first_line = next(open(filename))

1
¿Esto también cierra el archivo?
abalter

Finalmente, cuando Python abandona el bloque.
vy32

6

Muchas otras respuestas aquí, pero para responder con precisión la pregunta que hizo (antes de que @MarkAmery fuera y editara la pregunta original y cambiara el significado):

>>> 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 otras palabras, si ya has leído el archivo (como dijiste) y tienes un gran bloque de datos en la memoria, para obtener la primera línea de manera eficiente, haz una división () en el carácter de nueva línea, una vez solo, y tome el primer elemento de la lista resultante.

Tenga en cuenta que esto no incluye el \ncarácter al final de la línea, pero supongo que de todos modos no lo quiere (y un archivo de una sola línea puede que ni siquiera tenga uno). También tenga en cuenta que aunque es bastante corto y rápido, hace una copia de los datos, por lo que para una gran cantidad de memoria no puede considerarlo "eficiente". Como siempre, depende ...


8
Si se trata de un archivo grande, f.read () intentará cargar todo el archivo en la memoria, lo que no sería una buena idea. Una alternativa sería leer un carácter a la vez hasta que se encuentre una nueva línea o EOF
randomThought

En realidad, todas las otras respuestas son mejores alternativas que eso. Normalmente, leer un archivo con readline () y amigos cargaría bloques enteros a la vez, tal vez 32K más o menos, y buscar a través de eso para encontrar la próxima nueva línea. Mucho más rápido y más eficiente. Mi respuesta sería útil solo si ya está cargando todo, en cuyo caso podemos suponer que está de acuerdo con tenerlo todo en la memoria.
Peter Hansen

2
No estoy convencido de que haya cambiado el significado. No tiene sentido preguntar cómo "leer" la primera línea de un archivo después de "leer" todo el archivo. Como tal, es bastante obvio para mí que la intención del autor de la pregunta no fue suponer que .read()debe llamarse primero.
Mark Amery

@ MarkAmery, la pregunta estaba mal redactada ("bastante sin sentido"), por lo que adivinó la intención ("obvio para mí") y la reformuló para que coincida. Mi interpretación es diferente. Claramente hasta que Harpalss lo aclare, todo lo que tenemos es la redacción original más su aceptación de una respuesta (es decir, "buscar (0)") que para mí muestra claramente que ya había leído en el archivo, al menos más allá de la primera línea.
Peter Hansen

Deberías eliminar esta respuesta. no es la forma correcta y puede engañar a las personas.
Thang

-15
f1 = open("input1.txt", "r")
print(f1.readline())

20
Hay múltiples respuestas de más de cinco años que contienen exactamente este enfoque . No está haciendo nada más que crear ruido agregando otro.
Mark Amery
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.