Cómo leer un archivo línea por línea a una lista en Python
-
readlines
para leer el fichero línea a línea en Python - Iterar sobre el método de archivo para leer un archivo línea por línea en Python
-
Método
file.read
para leer el fichero línea a línea en Python - Comparación de diferentes métodos en la lectura de un fichero línea a línea 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.
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