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).
with open('myfile.txt')as f:
first_line = f.readline()
Algunas notas:
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.
La withdeclaración cierra automáticamente el archivo nuevamente cuando finaliza el bloque.
La withdeclaración solo funciona en Python 2.5 y versiones posteriores, y en Python 2.5 necesita usarfrom __future__ import with_statement
En Python 3, debe especificar la codificación del archivo que abre. Lee mas...
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).
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.
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 ...
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.
Respuestas:
Use el
.readline()
método ( documentos de Python 2 , documentos de Python 3 ):Algunas notas:
f.readline()
contendrá una nueva línea final. Es posible que desee utilizarf.readline().strip()
en su lugar para eliminar la nueva línea.with
declaración cierra automáticamente el archivo nuevamente cuando finaliza el bloque.with
declaración solo funciona en Python 2.5 y versiones posteriores, y en Python 2.5 necesita usarfrom __future__ import with_statement
fuente
mod_wsgi
).fuente
with
es mejor.fuente
rstrip()
elimina el carácter de nueva línea.Esto debería hacerlo:
fuente
Para volver al comienzo de un archivo abierto y luego devolver la primera línea, haga lo siguiente:
fuente
fuente
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):
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
\n
cará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 ...fuente
.read()
debe llamarse primero.fuente