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 ??
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 ??
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.