Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como excluir um dado de um arquivo de texto diretamente no código?

Desejo fazer um arquivo que guarde o nome e as pontuações do jogador. Se o jogador jogar mais uma vez e conseguir bater seu recorde, quero retirar a pontuação anterior do jogador e colocar a nova pontuação. Assim, o arquivo de texto guardaria apenas as melhores jogadas. Mas não sei como excluir a pontuação anterior do arquivo de texto.

3 respostas

Diretamente não, mas você pode ler o arquivo, trabalhar esse arquivo dentro da variável de leitura, limpar o arquivo lido e reescrever com a variável de leitura editada...

arquivo = open("lista.txt", 'r+', encoding='utf8') #abre o arquivo em modo de leitura e escrita
newfile = [] #criamos uma lista em branco para receber as novas strings
for linha in arquivo: #para cada linha dentro do arquivo
    linha = linha.strip() #retire os espaços e caracteres de pulo de linha /n da palavra
    if linha == "banana": #se a palavra contida na linha for banana
        linha = "abobora" #trocamos por abobora
    newfile.append(linha+'\n') #adicionamos a palavra na lista

arquivo.truncate(0) #apagamos o conteúdo do arquivo até a última linha
arquivo.seek(0) #voltamos para o início do arquivo

for linha in newfile: #para cada item em nossa lista
    arquivo.writelines(linha) #escrevemos o item no arquivo, e como tem \n, pulará uma linha

arquivo.close() #fechamos o arquivo

É uma forma manual de várias formas possíveis.

Eu tentei implementar conforme o que voce me indicou e criei a seguinte função:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O arquivo possui nome do jogador e pontos em linhas intercaladas, conforme a figura:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

No entanto, a função apresenta um erro, pois toda vez que o jogador JOBSON joga, a função escreve no arquivo um novo jogador JOBSON com outra pontuação. Ou seja, a função não identifica que já existe um jogador JOBSON e não o atualiza.

Você pode me ajudar?

solução!

O problema está na forma que você está fazendo a implementação, está com muito processamento desnecessário e por conta disso a lógica do seu código se enrolou e está falhando, além de estar confuso. Você pode fazer toda checagem e alteração diretamente no loop FOR como eu fiz no exemplo, depois zerar o arquivo e reescrever com a nova lista...

Eu recomendaria você trabalhar com dicionários, já que sempre vai ter uma pontuação (pontos) em uma chave única (jogador), isso até facilita o trabalho pois você consegue mudar diretamente a pontuação procurando a chave na lista.

Mas vamos resolver seu problema com cada linha imprimindo um nome e uma pontuação diferente. O que temos que fazer é checar se o nome é igual e repetir ele na lista, e dizer ao programa que a próxima linha deve ser colocada a nova pontuação desse nome, e caso o nome não deja igual ele simplesmente só recoloca o nome ou pontuação lida na nova lista.

lista.txt:

maracujá
10
banana
20
abacate
30
melancia
40
maçã
50
file = open("lista.txt", 'r+', encoding='utf8')
new_list = []
change_points = False
name = 'melancia'
points = '0'

for word in file:
    word = word.strip() #tira os espaços e quebras de linha

    if(change_points):         #devo alterar a pontuação?
        change_points = False        #se eu vou alterar agora, não vou precisar alterar mais
        new_list.append(points)        #escrevo a nova pontuação na lista
        continue      #pulo para a próxima iteração do loop sem processar o que está baixo pois não preciso escrever mais nada nessa iteração

    if(word == name): #nome é igual?
        change_points = True #então digo que deve alterar a pontuação que vem a seguir na próxima iteração do FOR

    new_list.append(word) #escrevo a string da vez na nova lista

print(new_list)
file.truncate(0)
file.seek(0)

for line in new_list:
    file.writelines(line+'\n')

file.close()