python – Select right line with Split in TXT

Question:

My question is how after separating lines in lists, can also take up these values and only do append the correct line ( numero_linha function).

But also, getting the whole line, and not just 10 positions of the txt sentence, as it is returning line 0 and 10 positions of this line.

musica.txt file:

Roda Viva
Chico Buarque

Tem dias que a gente se sente
Como quem partiu ou morreu
A gente estancou de repente
Ou foi o mundo então que cresceu
A gente quer ter voz ativa
No nosso destino mandar
Mas eis que chega a roda viva
E carrega o destino pra lá

Roda mundo, roda-gigante
Roda moinho, roda pião

O tempo rodou num instante
Nas voltas do meu coração
A gente vai contra a corrente
Até não poder resistir
Na volta do barco é que sente
O quanto deixou de cumprir
Faz tempo que a gente cultiva
A mais linda roseira que há
Mas eis que chega a roda viva
E carrega a roseira pra lá

Roda mundo, roda-gigante
Roda moinho, roda pião
 # função para ler, extrair valores do TXT
 def extrai_linha_txt(nome_arquivo: str, numero_linha: int):

    palavras_linha = []
    
    # le o arquivo com o comando 'with' utilizando o parametro 'nome_arquivo'
    with open(file=nome_arquivo, mode='r', encoding='utf8') as fp:   
    
    # extrair linha do arquivo utilizando o parametro 'numero_linha'
     linha = fp.readline()
     count = 1
    
    # quebra a linha em palavras com o comando split ' '
    while count < numero_linha:
        
            linha = linha.rstrip('\n')
            linha_formatada = linha.split(sep=' ')
            palavras_linha.append(linha_formatada)
                                    
            count += 1 
                    
    return palavras_linha
    
 # chamada de função com parâmetros da linha selecionada
 linha10 = extrai_linha_txt(nome_arquivo='./musica.txt', numero_linha=10)
 print(linha10) # deve retornar ['Mas', 'eis', 'que', 'chega', 'a', 'roda', 'viva']

Answer:

To select the correct line from the file, you just iterate line by line and count which line you are on, as soon as you reach the desired line, just return the words that are in it.

You can iterate over the row counter along with its contents using the enumerate function:

def le_linha(nome_arquivo, num_linha):
    with open(nome_arquivo, mode="r", encoding="utf8") as file:
        for i, linha in enumerate(file, start=1):
            if i == num_linha:
                return linha.split()

    # caso não ache a linha, retorna lista vazia
    return []


print(le_linha("musica.txt", 10))
# ['Mas', 'eis', 'que', 'chega', 'a', 'roda', 'viva']

print(le_linha("musica.txt", 11))
# ['E', 'carrega', 'o', 'destino', 'pra', 'lá']

print(le_linha("musica.txt", 999))
# []

Code running on Repl.it

As I return the result as soon as I find the line, I don't unnecessarily read the rest of the file, nor do I load the entire file into memory, just the line being read.


Remember that whenever you iterate over a file, it iterates line by line in the file without including the line break characters ( see documentation ) so it's memory efficient and fast.

Scroll to Top