2010-06-24 7 views
0

J'ai une fonction simple qui trie un dictionnaire:écrire des résultats triés pour déposer

data = inputfile.readlines() 
lineData = sorted(data, key=len, reverse=True)[:3] 

Impression de la sortie:

print sorted(data, key=len, reverse=True)[:3] 

génère le résultat attendu, écrit toutefois déposer:

outputfile.writelines sorted(data, key=len, reverse=True)[:3] 

ne génère rien. Comment puis-je écrire la sortie dans le fichier texte (fichier de sortie)? Le code complet est comme suit:

import sys, string 
inputfilenames, outputfilename = sys.argv[1:-1], sys.argv[-1] 


def do_something_with_input(inputfile): 
    data = inputfile.readlines() 
    print sorted(data, key=len, reverse=True)[:3] 
    print sys.path[0]+"/"+ outputfilename 


def write_results(outputfile): 
    data = inputfile.readlines() 
    outputfile.writelines(sorted(data, key=len, reverse=True)[:3]) 

for inputfilename in inputfilenames: 
    inputfile = open(inputfilename, "r") 
    do_something_with_input(inputfile) 
    outputfile = open(outputfilename, "w") 
    write_results(outputfile) 

Répondre

1

writelines est une méthode, vous devez appeler:

outputfile.writelines(sorted(data, key=len, reverse=True)[:3]) 

ETA
Fonction open fournit des descripteur de fichier qui pourrait être itéré fois. Vous le faites dans votre do_something_with_input fonction, après le inputfile itéré plus de, l'itérateur est épuisé. Ce qui signifie que toute autre itération, telle que faite dans vos fonctions write_results donnerait une séquence vide. C'est pourquoi rien n'est écrit dans le fichier de sortie. En gros, il est équivalent à:

>>> a = (i for i in range(2)) 
>>> list(a) 
[0, 1] 
>>> list(a) 
[] 

Ce que vous devez faire est de stocker la sortie du sorted(...) puis écrire dans le fichier, essayez de ne pas générer de nouveau.

+0

Merci. Modifier la fonction write_results était exactement ce que je devais faire. – kjarsenal

0

Vous écrivez:

outputfile.writelines sorted(data, key=len, reverse=True)[:3] 

génère rien.

il devrait effectivement générer une exception d'erreur de syntaxe en raison des parenthèses manquantes - si elle ne constitue pas, je suppose que vous devez utiliser une (soi-disant) « intelligent » IDE comme ipython qui met entre parenthèses sur votre nom - est-ce le cas?

Vous imprimez les trois lignes les plus courtes, et elles peuvent toutes être vides - cela devrait mettre trois lignes vides dans votre fichier de sortie (et bien sûr ne montrer rien à stdout - est ce que vous entendez par "génère rien"?). Peut-être que vous n'appelez pas correctement outputfile.close() alors au moment où vous vérifiez le fichier, ils sont encore tamponnés et pas encore écrits sur le disque.

Comme vous le voyez, il existe un très grand nombre de possibilités autour de votre assertion très ambiguë "Générer rien". Pouvez-vous préciser exactement quel environnement vous utilisez et comment, en particulier, vous vérifiez ce que votre code "génère" ou non? Sinon, c'est très difficile de vous aider beaucoup.

Modifier: l'OP clarifié et a montré son code - et le problème est maintenant clair: il est tout à fait consommer inputfile la première fois, jamais « rembobiner », donc le fichier se termine immédiatement (pas de lignes à gauche en elle) au deuxième readlines appel.Si vous devez lire le fichier deux fois de manière indépendante (plutôt que de simplement le lire une fois et de transmettre les données, comme d'habitude), vous devrez appeler inputfile.seek(0) pour "rembobiner le fichier" chaque fois que vous le lisez pour le rendre prêt à être lu à nouveau.

+0

Désolé. Ce que j'aurais dû dire, c'était générer un fichier texte vide. L'entrée a été modifiée pour fournir le code complet. J'utilise IDLE. – kjarsenal

+0

En outre, il devrait appeler les trois lignes les plus longues. La sortie imprimée le fait. – kjarsenal

+0

@kjarsenal, maintenant que vous montrez votre code, le problème est devenu clair, voir la modification de ma réponse. –

Questions connexes