Cómo leer un archivo línea por línea a una lista en Python

Jinku Hu 10 octubre 2023
  1. readlines para leer el fichero línea a línea en Python
  2. Iterar sobre el método de archivo para leer un archivo línea por línea en Python
  3. Método file.read para leer el fichero línea a línea en Python
  4. Comparación de diferentes métodos en la lectura de un fichero línea a línea en Python
Cómo leer un archivo línea por línea a una lista en Python

Supongamos que tenemos un archivo con el contenido de abajo,

Line One: 1
Line Two: 2
Line Three: 3
Line Four: 4
Line Five: 5

Necesitamos leer el contenido del archivo línea por línea a una lista, ["Line One: 1", "Line Two: 2", "Line Three: 3", "Line Four: 4", "Line Five: 5"].

Introduciremos diferentes métodos para leer un archivo línea por línea a una lista abajo.

readlines para leer el fichero línea a línea en Python

readlines devuelve una lista de líneas de la secuencia.

>>> filePath = r"/your/file/path"
>>> with open(filePath, 'r', encoding='utf-8') as f:
	f.readlines()

	
['Line One: 1\n', 'Line Two: 2\n', 'Line Three: 3\n', 'Line Four: 4\n', 'Line Five: 5']

El carácter final \n también está incluido en la cadena y puede ser eliminado con str.rstrip('\n')

>>> with open(filePath, 'r', encoding='utf-8') as f:
	[_.rstrip('\n') for _ in f.readlines()]

	
['Line One: 1', 'Line Two: 2', 'Line Three: 3', 'Line Four: 4', 'Line Five: 5']

Iterar sobre el método de archivo para leer un archivo línea por línea en Python

Podríamos iterar sobre el archivo para leerlo línea por línea, en lugar de usar readlines.

>>> with open(filePath, 'r', encoding='utf-8') as f:
	[_.rstrip('\n') for _ in f]

	
['Line One: 1', 'Line Two: 2', 'Line Three: 3', 'Line Four: 4', 'Line Five: 5']

Este método es mucho mejor que el anterior desde el punto de vista del uso de la memoria. El método readlines mantiene todas las líneas del fichero en la memoria, pero el método de interación sólo lleva una línea del contenido del fichero a la memoria y la procesa. Es preferible si el tamaño del fichero es super grande para evitar el MemoryError.

Método file.read para leer el fichero línea a línea en Python

file.read(size=-1, /) lee desde el archivo hasta EOF si no se establece size. Podríamos dividir las líneas de él usando la función str.splitlines.

>>> with open(filePath, 'r') as f:
	f.read().splitlines()

	
['Line One: 1', 'Line Two: 2', 'Line Three: 3', 'Line Four: 4', 'Line Five: 5']

El resultado no incluye el carácter final \n en el método por defecto str.splitlines. Pero podría incluir \n si el parámetro keepends está establecido como True.

>>> with open(filePath, 'r') as f:
	f.read().splitlines(keepends=True)

	
['Line One: 1\n', 'Line Two: 2\n', 'Line Three: 3\n', 'Line Four: 4\n', 'Line Five: 5']

Comparación de diferentes métodos en la lectura de un fichero línea a línea en Python

Compararemos el rendimiento de la eficiencia entre los diferentes métodos introducidos en este artículo. Aumentamos el número de líneas en el archivo probado a 8000 para comparar fácilmente la diferencia de rendimiento.

>>> timeit.timeit('''with open(filePath, 'r', encoding='utf-8') as f:
			f.readlines()''',
	      setup='filePath=r"C:\Test\Test.txt"',
	      number = 10000)
16.36330720000001
>>> timeit.timeit('''with open(filePath, 'r', encoding='utf-8') as f:
			[_ for _ in f]''',
	      setup='filePath=r"C:\Test\Test.txt"',
	      number = 10000)
18.37279060000003
>>> timeit.timeit('''with open(filePath, 'r', encoding='utf-8') as f:
			f.read().splitlines()''',
	      setup='filePath=r"C:\Test\Test.txt"',
	      number = 10000)
12.122660100000019

El método readlines() es ligeramente mejor que el método de iteración de ficheros, y file.read().splitlines() es el método más eficiente con un margen de más del 25% comparado con los otros dos métodos.

Pero, si en la aplicación BigData donde la memoria es el limitador, el método de iteración de archivos es el mejor como se explicó anteriormente.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - Python String