Percebo que como ler linhas de um arquivo no intervalo [inÃcio, fim] é uma pergunta comum, no entanto muitas das respostas padrão não funcionam bem para meu conjunto de dados.
Especificamente, tenho arquivos de dados com 500 mil linhas e 100 mil colunas. Cada bloco de 50 linhas é um conjunto de dados separado que preciso ler como um bloco, analisar e, então, passar para o próximo bloco. Usar readlines() para criar um objeto de dados que eu possa amostrar em incrementos de 50 não funcionará, porque os objetos de dados ocupam muita memória.
Achei que algo como o seguinte funcionaria (para o exemplo abaixo, criei um arquivo de teste com 150 linhas (3 réplicas de 50). "myfunction()" é apenas um espaço reservado para o processamento de cada linha)
infile = open("test_file", "r")
outfile = open("out_test_file", "w")
for rep in range(0:3):
to_sample = list(range(rep*50, rep*50+50))
i = 0
for line in infile:
if i in to_sample:
something_useful = my_function(line)
i=i+1
outfile.write(str(something_useful))
outfile.close()
O script me ajuda a passar pela primeira iteração de 50, mas depois não pode prosseguir, provavelmente porque o
for line infile
O loop não inicia no inÃcio do arquivo durante a próxima iteração de rep, pois ele já leu a última linha do infile.
Como eu disse, se os arquivos de dados fossem de tamanho gerenciável, eu poderia usar apenas readlines e então amostrar a matriz nos intervalos desejados usando o loop sobre rep e número de linha, mas isso não é viável para este conjunto de dados. Qual seria uma alternativa eficiente?
O loop interno lê o arquivo inteiro. Quando você repete o loop externo, não sobra nada no arquivo para ler.
Use um loop de intervalo para o loop interno e chame
readline()
.Se você quiser processar apenas certos números de linha, você pode fazer isto: