1
resposta

Como selecionar uma linha especifica de um arquivo txt?



# AGENDA EM TXT
def roda_agenda():
    while True:
        opcao = apresenta_menu()

# GERA FUNCOES DO PROGRAMA
        if opcao == 1:
            print("Agenda:")
            print("**********************************")
            ler_agenda("agenda.txt")
            print("**********************************")
        elif opcao == 2:
            print("Cadastrar")
            incluir_nome("agenda.txt")
            print("**********************************")
        elif opcao == 3:
            print("Excluir")
            excluir_contato("agenda.txt")


# APRESENTA MENU
def apresenta_menu():
    print("AGENDA: Selecione uma opção:")
    print("****************************")
    opcao = int(input("1 (Agenda), 2 (Cadastrar), 3 (Excluir)"))
    return opcao


# LER AGENDA
def ler_agenda(enderecoarquivo):
    print("Agenda:")
    x = open(f"{enderecoarquivo}", "r")
    for u in x:
        ajuste = u.strip().split(";")
        print(f"{ajuste[0]} > {ajuste[1].upper()} - {ajuste[2]} ")
    x.close()
    quebra_de_linha()


# CADASTRAR
def incluir_nome(enderecoarquivo):
    novo_nome = input("Novo Nome:")
    novo_telefone = input("Novo Telefone:")

    # LEITURA PARA PEGAR O ID ATRAVÉS TOTAL DE LINHAS DO ARQUIVO
    y = open(f"{enderecoarquivo}", "r")
    total_linhas = len(y.readlines())
    id = total_linhas+1
    y.close()

    # ESCRITA
    x = open(f"{enderecoarquivo}", "a")
    escreve = x.writelines(f"\n{id};{novo_nome};{novo_telefone}")
    x.close()
    print("Adicionado!")
    quebra_de_linha()

    # EXCLUIR
def excluir_contato(enderecoarquivo):
    ler_agenda(enderecoarquivo)
    excluir_id = int(input("Escolha qual ID deseja excluir:"))


# QUEBRA DE LINHA
def quebra_de_linha():
    print("\n")


# RODAR APP
if __name__ == "__main__":
    roda_agenda()

Como faço?

agenda.txt
1;Guilherme;312312312
2;Maria Eluiza;54 123123123
3;Nome;54342434
4;adsasdas;4324234
5;fsdgdfgdfgdf;423423423
6;dasdasdas;534534
7;dfsfdsfs;234234
8;Coldzera;5345343
9;Taco;34543534534
10;teste;534534534
1 resposta

Olá Guilherme,

Dependendo do seu objetivo isso pode ser feito de maneiras diferentes. O mais simples seria ler o arquivo completo com .readlines() e acessar a linha desejada pelo índice, exemplo:

endereco_arquivo = "agenda.txt"

with open(endereco_arquivo, "r") as arquivo:
    linhas = arquivo.readlines()
    # Acessando a oitava linha do arquivo 
    print(linhas[7])

# Resultado: "8;Coldzera;5345343"

Caso não tenha o número da linha e queira buscar pelo nome é só buscar dentro da lista de linhas pelo nome:

endereco_arquivo = "agenda.txt"

with open(endereco_arquivo, "r") as arquivo:
    contatos = arquivo.readlines()
    for contato in contatos:
        if f";{nome};" in contato:
            print(contato)
            break

Caso você queira acessar para fazer alguma alteração a solução vai ser também utilizar o .readlines() para ler o arquivo completo, editar a lista retornada pelo .readlines() e então reescrever o arquivo completo. Segue um exemplo de como seria uma função de atualização no seu programa:

def atualiza_contato(endereco_arquivo, linha_a_ser_editada):
    novo_nome = input("Novo nome: ")
    novo_telefone = input("Novo telefone: ")

    novo_contato = f"{linha_a_ser_editada};{novo_nome};{novo_telefone}\n"

    with open(endereco_arquivo, "r") as arquivo:
        arquivo_conteudo = arquivo.readlines()
        arquivo_conteudo[linha_a_ser_editada-1] = novo_contato

    # Reescrevendo todo o arquivo
    with open(f"{endereco_arquivo}", "w") as arquivo:
        arquivo.writelines(arquivo_conteudo)


atualiza_contato("agenda.txt", 7)

Para o excluir seria algo parecido com o editar acima. Foi bem legal esse "desafio" que você começou a fazer, seguindo a ideia eu e o pessoal aqui da equipe fizemos um editar que busca pela linha ou pelo nome, segue o código:

def atualiza_contato(endereco_arquivo, parametro):
    nome = input("Novo nome: ")
    telefone = input("Novo telefone: ")

    with open(endereco_arquivo, "r") as arquivo:
        contatos = arquivo.readlines()
        if isinstance(parametro, int):
            novo_contato = f"{parametro};{nome};{telefone}\n"
            contatos[parametro-1] = novo_contato
        if isinstance(parametro, str):
            for indice, contato in enumerate(contatos):
                if f";{parametro};" in contato:
                    novo_contato = f"{indice + 1};{nome};{telefone}\n"
                    contatos[indice] = novo_contato
                    break

    with open(f"{endereco_arquivo}", "w") as arquivo:
        arquivo.writelines(contatos)

# A função pode ser chamada com o id ou com o nome:
atualiza_contato("agenda.txt", 7)
atualiza_contato("agenda.txt", "Maria Eluiza")

Espero ter ajudado, qualquer coisa é só falar!