HOWTO · Python
Como ler um arquivo linha por linha para uma lista em Python
Este tutorial introduz como ler um arquivo linha por linha para uma lista em Python
Suponha que temos um arquivo com o conteúdo abaixo,
Line One: 1
Line Two: 2
Line Three: 3
Line Four: 4
Line Five: 5
Precisamos ler o conteúdo do arquivo linha por linha para uma lista, ["Line One: 1", "Line Two: 2", "Line Three: 3", "Line Four: 4", "Line Five: 5"].
Vamos introduzir diferentes métodos para ler um arquivo linha a linha para uma lista abaixo.
readlines para ler o arquivo linha por linha em Python
readlines retorna uma lista de linhas do fluxo.
>>> 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']
O caractere final \n também está incluído na string e poderia ser removido com 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 o método de arquivo para ler um arquivo linha por linha em Python
Nós poderíamos iterar sobre o arquivo para lê-lo linha por linha, ao invés de utilizar 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 é muito melhor do que o método acima da perspectiva de utilização da memória. O método readlines guarda todas as linhas do arquivo na memória, mas o método de interação leva apenas uma linha do conteúdo do arquivo para a memória e o processa. É preferível se o tamanho do arquivo for super grande para evitar o MemoryError.
Método file.read para ler o arquivo linha por linha em Python
O file.read(size=-1, /) lê do arquivo até o EOF se o size não estiver definido. Nós poderíamos dividir as linhas a partir dele utilizando a função 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']
O resultado não inclui o caractere final \n no método padrão str.splitlines. Mas você poderia incluir \n se o parâmetro keepends estiver definido para ser 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']
Comparação de diferentes métodos na leitura de um arquivo linha por linha em Python
Iremos comparar o desempenho da eficiência entre os diferentes métodos introduzidos neste artigo. Aumentamos o número de linhas no arquivo testado para 8000 para comparar facilmente a diferença de desempenho.
>>> 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
O método readlines() é ligeiramente melhor que o método de iteração de arquivos, e file.read().splitlines() é o método mais eficiente com margem de mais de 25% comparado com os outros dois métodos.
Mas, se na aplicação BigData onde a memória é o constrangedor, o método de iteração de arquivos é o melhor, como explicado acima.