Ler linhas específicas de um arquivo de forma eficiente é crucial para muitos programas Python. A abordagem ideal depende fortemente do tamanho do arquivo e da frequência com que você precisa acessar essas linhas. Este guia explora vários métodos, cada um adaptado a diferentes cenários.
Sumário
- Lendo Linhas Específicas de Arquivos Pequenos
- Acessando Linhas Múltiplas Vezes de Forma Eficiente
- Lidando com Arquivos Grandes de Forma Eficiente
- Técnicas Avançadas para Conjuntos de Dados Massivos
- Perguntas Frequentes
Lendo Linhas Específicas de Arquivos Pequenos
Para arquivos pequenos que cabem confortavelmente na memória, o método readlines()
oferece uma solução simples. Este método lê todas as linhas em uma lista, permitindo acesso direto via indexação.
def read_specific_lines_small_file(filepath, line_numbers):
"""Lê linhas específicas de um arquivo pequeno.
Args:
filepath: Caminho para o arquivo.
line_numbers: Uma lista de números de linha (índice baseado em 0) a serem lidos.
Returns:
Uma lista de strings, contendo as linhas solicitadas. Retorna uma lista vazia se o arquivo não for encontrado.
"""
try:
with open(filepath, 'r') as file:
lines = file.readlines()
return [lines[i].strip() for i in line_numbers if 0 <= i < len(lines)]
except FileNotFoundError:
return []
filepath = "my_small_file.txt"
line_numbers_to_read = [0, 2, 4] # Ler linhas 1, 3 e 5 (índice baseado em 0)
lines = read_specific_lines_small_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
Embora simples, essa abordagem se torna ineficiente para arquivos maiores.
Acessando Linhas Múltiplas Vezes de Forma Eficiente
Se você acessar repetidamente as mesmas linhas, o módulo linecache
oferece ganhos significativos de desempenho ao armazenar em cache as linhas, minimizando a E/S do disco.
import linecache
def read_specific_lines_linecache(filepath, line_numbers):
"""Lê linhas específicas usando linecache (indexação baseada em 1).
Args:
filepath: Caminho para o arquivo.
line_numbers: Uma lista de números de linha (índice baseado em 1) a serem lidos.
Returns:
Uma lista de strings, contendo as linhas solicitadas. Retorna uma lista vazia se o arquivo não for encontrado ou as linhas estiverem fora do intervalo.
"""
lines = [linecache.getline(filepath, line_number).strip() for line_number in line_numbers if linecache.getline(filepath, line_number)]
return lines
filepath = "my_file.txt"
line_numbers_to_read = [1, 3, 5] # Ler linhas 1, 3 e 5 (índice baseado em 1)
lines = read_specific_lines_linecache(filepath, line_numbers_to_read)
for line in lines:
print(line)
Observe que o linecache
usa indexação baseada em 1.
Lidando com Arquivos Grandes de Forma Eficiente
Para arquivos grandes, evite carregar tudo na memória. Itere linha por linha usando enumerate()
para rastrear os números das linhas.
def read_specific_lines_large_file(filepath, line_numbers):
"""Lê linhas específicas de um arquivo grande de forma eficiente.
Args:
filepath: Caminho para o arquivo.
line_numbers: Uma lista de números de linha (índice baseado em 0) a serem lidos.
Returns:
Uma lista de strings, contendo as linhas solicitadas. Retorna uma lista vazia se o arquivo não for encontrado.
"""
try:
lines_to_return = []
with open(filepath, 'r') as file:
for i, line in enumerate(file):
if i in line_numbers:
lines_to_return.append(line.strip())
return lines_to_return
except FileNotFoundError:
return []
filepath = "my_large_file.txt"
line_numbers_to_read = [100, 500, 1000] # Ler linhas 101, 501 e 1001 (índice baseado em 0)
lines = read_specific_lines_large_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
Este método é eficiente em termos de memória para arquivos grandes.
Técnicas Avançadas para Conjuntos de Dados Massivos
Para arquivos excepcionalmente grandes que excedem a RAM disponível, considere arquivos mapeados em memória ou bibliotecas especializadas como dask
ou vaex
, que são projetadas para lidar com conjuntos de dados que não cabem na memória.
Perguntas Frequentes
- P: E se um número de linha estiver fora do intervalo? Os métodos fornecidos tratam elegantemente os números de linha fora do intervalo simplesmente os omitindo.
- P: Posso ler linhas com base em uma condição em vez do número da linha? Sim, substitua a verificação do número da linha por uma instrução condicional (por exemplo,
if "palavra-chave" in line:
).