1
resposta

Há alguma forma mais veloz de caminhar pelo arquivo ??

Por exemplo, imagina q eu tenho um arquivo de 1000 linha e eu quero ler a linha 952, eu não quero ter q usar um laço para percorrer todas essas linhas, tem alguma forma mais otimizada de fazer isso ??

1 resposta

Iuri,

Não, arquivos texto são arquivos de bytes sequenciais, e como cada linha pode ter um número de bytes diferente, não há uma forma direta de ir até uma certa linha sem saber a sua posição primeiro. Para saber onde está a próxima linha é necessário ler os bytes do arquivo até encontrar o byte que indica o fim da linha. É isso que o método readline() e seus equivalentes fazem.

Existem exceções:

Se todas as linhas do arquivo tem o mesmo tamanho em bytes, você pode multiplicar pelo número da linha e ir direto pra posição:

tamanho_da_linha = 60
# todas as linhas do arquivo tem 60 bytes
with open(nome_arq) as f:
    f.seek(tamanho_da_linha * 952) 
    # vai direto para a posicão da linha 952
    linha = f.readline()

Se você já sabe que o arquivo tem 1000 linhas, é possível percorrer de trás pra frente e percorrer um caminho menor, apesar que isto também percorreria o arquivo, porém em sentido inverso.

O módulo linecache apontado na outra resposta percorre o arquivo uma única vez e cria um índice remissivo, armazenando a posição em bytes dentro do arquivo onde se encontra cada linha. Isso permite depois que se posicione o arquivo em uma linha específica sem passar pelas demais linhas, mas é necessário percorrer o arquivo pelo menos uma vez para criar esse índice antes de usar.