2014-06-25 4 views
-1

Ce que je fais est, enlever toutes les parties du discours excepté les noms d'un texte.Pourquoi ma fonction retourne une chaîne vide en python?

J'ai écrit une fonction pour cela. Ce n'est peut-être pas le meilleur ou le meilleur code pour le faire parce que je viens de commencer à coder en python. Je suis sûr que le bug doit être très basique mais je ne suis tout simplement pas capable de le comprendre.

Dans ma fonction deux entrées vont comme paramètres. L'un est l'emplacement du texte sur le disque dur et l'autre est l'emplacement du fichier où nous voulons la sortie.

Voici le code.

def extract_nouns(i_location, o_location): 
    import nltk 

    with open(i_location, "r") as myfile: 
     data = myfile.read().replace('\n', '')   

    tokens = nltk.word_tokenize(data) 
    tagged = nltk.pos_tag(tokens) 
    length = len(tagged) 
    a = list() 

    for i in range(0,length): 
     print(i) 
     log = (tagged[i][1][0] == 'N') 
     if log == False: 
      a.append(tagged[i][0]) 

    fin = open(i_location, 'r') 
    fout = open(o_location, "w+") 

    for line in fin: 
     for word in a: 
      line = line.replace(word, "") 
     fout.write(line) 

    with open(o_location, "r") as myfile_new: 
     data_out = myfile_new.read().replace('\n', '') 

    return data_out 

Lorsque j'appelle cette fonction, cela fonctionne très bien. Je reçois la sortie sur le disque dur comme je l'avais prévu mais il ne retourne pas la sortie sur l'interface ou devrais-je dire, il retourne une chaîne vide au lieu de la chaîne de sortie réelle.

Voici comment je l'appelle.

t = extract_nouns("input.txt","output.txt") 

Si vous voulez l'essayer, prendre à la suite que le contenu du fichier d'entrée

"At eight o'clock on 
Thursday film morning word line test 
best beautiful Ram Aaron design" 

Ceci est la sortie que je reçois dans le fichier de sortie (sortie.txt) quand je l'appelle la fonction mais la fonction renvoie une chaîne vide sur l'interface à la place. Il n'imprime même pas la sortie.

"  
Thursday film morning word line test 
    Ram Aar design" 
+0

duplication possible de [Comment extraire noms utilisant NLTK pos \ _tag()?] (http://stackoverflow.com/questions/24409642/how-to-extract-nouns-using-nltk-pos-tag) – alvas

+0

avez-vous essayé le code précédent que j'ai suggéré dans http://stackoverflow.com/questions/24409642/how-to-extract-nouns-using-nltk-pos-tag – alvas

+0

@alvas c'est un problème complètement différent. C'est pourquoi je ne l'ai pas apporté là-bas. Et j'ai déjà essayé votre suggestion, je vais une fois que je pense à cette chose de base. Je suis très curieux de savoir ce qu'est le bug dans ma fonction. Pourriez-vous s'il vous plaît m'aider. – user3710832

Répondre

1

Vous devez fermer d'abord le fichier:

for line in fin: 
    for word in a: 
     line = line.replace(word, "") 
      fout.write(line) 
fout.close() 

à l'aide with est généralement la meilleure façon d'ouvrir les fichiers comme il se ferme automatiquement eux et file.seek() pour revenir à la début du fichier à lire:

def extract_nouns(i_location, o_location): 
    import nltk 

    with open(i_location, "r") as myfile: 
     data = myfile.read().replace('\n', '') 

    tokens = nltk.word_tokenize(data) 
    tagged = nltk.pos_tag(tokens) 
    length = len(tagged) 
    a = [] 

    for i in range(0,length): 
     print(i) 
     log = (tagged[i][1][0] == 'N') 
     if not log: 
      a.append(tagged[i][0]) 
    with open(i_location, 'r') as fin, open(o_location, "w+") as fout: 
     for line in fin: 
      for word in a: 
       line = line.replace(word, "") 
      fout.write(line) 
      fout.seek(0) # go back to start of file 
      data_out = fout.read().replace('\n' , '') 
     return data_out 
+0

Jésus! Je n'aurais jamais compris! Merci beaucoup Padraic. Je devenais fou de ce bug. Merci beaucoup! – user3710832

+0

Pas de soucis, j'ai ajouté du code en utilisant seek et avec pour ouvrir tous les fichiers. Si vous utilisez 'with ', oublier de fermer les fichiers ne sera plus un problème! –

0

La dernière instruction de la fonction devrait être le return. Parce qu'il y a le print data_out, vous renvoyez la valeur de retour de print qui n'en est aucun.

Par exemple:

In []: def test(): 
    ..:  print 'Hello!' 
    ..: 

In []: res = test() 
Hello! 

In []: res is None 
Out[]: True 
+0

même si je supprime le 'print data_out'! ne fonctionne toujours pas! – user3710832

+0

quelle version de python utilisez-vous? Quelle est la traceback d'erreur? – alvas

Questions connexes