Olá, (se quiser pule para a frase antes do código para descrição)
há algumas semanas tento fazer um programa em python que abre um arquivo de texto, lê e retorna palavras mais usadas. Posteriormente alterei o programa para receber uma string e fazer o previsto, mas tenho tido um grande problema. Eu debuguei com o Visual Community e verifiquei que todas as variáveis perdiam seus valores quando o programa entrava em sua primeira função. O erro que aparece no console leva a crer no mesmo.
Tive um problema parecido quando estava no início da minha aprendizagem com C++ e resolvi o problema duplicando a referencia à variável utilizando um ponteiro. Não sei se existe alguma função (em python) que retorne um ponteiro.
Acho que a perda de valor das variáveis é devido ao coletor de lixo (não estudei muito sobre o coletor de lixo em python).
Antes de mostrar o programa peço que alguém me ajude com a formatação de código.
# import os
#inicialização de variáveis
DIC = {} #dicionario onde ficaram as palavras
temp_char = ""
temp_palavra = ""
tam_palavra = 0
palavra = ""
lista = [] #lista que auxilia o dicionario
espaco = " "
pontuacao = [".", "!", ";", "?", ",", ":"] #pontuacao necessaria para nao confundir "os.getcwd()" com "os" "cwd()" que sao duas palavras diferentes
posicao = None
palavra_tam = 0
selec_palavra = None
end_file = False #fim do arquivo
#print (os.getcwd()) #imprime o diretorio atual
fo = open('Desktop/Texto.txt', "r")
#seleciona o proximo caracter
def next_char():
print (tam_palavra)
tam_palavra +=1
temp_char = fo.read(1)
if (temp_char == None):
end_file = True
pass
temp_palavra += temp_char
#ve se eh <espaco> para terminar a palavra
def selec_palavra():
if(temp_char == " "):
selec_palavra = True
elif(temp_char in pontuacao):
next_char()
if(temp_char == " "):
selec_palavra = False
else:
selec_palavra = 0
else:
selec_palavra = 1
#nao tem uma finalidade muito util provavelmente vou retira-la
def escolha():
if selec_palavra == True:
fim_palavra()
return True
elif selec_palavra == False:
fim_palavra()
return True
elif selec_palavra == 0: #A palavra não terminou
return False
#procedimento ao terminar a palavra
def fim_palavra():
palavra = temp_palavra
temp_char = ""
temp_palavra = ""
fo.seek(1, -tam_palavra + 1)
while(temp_char != " "):
temp_palavra += temp_char
temp_char = fo.read(1)
if(temp_palavra != palavra):
print (palavra+ " "+temp_palavra)
#funcao onde tem a estrutura principal do programa
def _init():
while(not end_file):
next_char()
selec_palavra()
if (not escolha()):
next_char()
if(palavra != " "):
lista.append[palavra]
palavra = ""
temp_palavra = ""
tam_palavra = 0
temp_char = ""
for item in lista:
if (list[item] in DIC):
DIC[lista[item]]+=1
else:
DIC[lista[item]]=1
print (DIC)
fo.close()
raw_input("fim do programa \n")
#chama o laco principal
_init()