2016-05-08 1 views
0

Je crée un générateur de texte Markov qui génère des haïkus. La fonction de génération du haiku lui-même génèrera 100 haïkus en utilisant une boucle for. Ils peuvent ressembler à:Écrire dans un fichier, ajouter un espace supplémentaire

line1 line2 line3 line1 line2 line3 line1 line2 line3

Lorsque je tente d'écrire ces lignes dans le fichier, je veux inclure un espace entre chaque haïku , donc il ressemble à:

line1 
line2 
line3 

line1 
line2 
line3 

line1 
line2 
line3 

Comment est-ce que je rendrais ceci se produire en écrivant dans le dossier?

aussi, parfois, il ne préserverait pas le format ... parfois, il est écrit que line1line2line3

Comment puis-je structurer ma boucle?

J'ai essayé:

def writeToFile(): 
    with open("results.txt", "w") as fp: 
     count = 0 
     for haiku in haikuList: 
      for line in haiku: 
       for item in line: 
        fp.write(str(item)) 
        count += 1 
     print "There are", count, "lines in your file." 

haikuList ressemble:

[[line1, 
    line2, 
    line3], 
[line1, 
    line2, 
    line3], 
[line1, 
    line2, 
    line3], 
[line1, 
    line2, 
    line3]] 
+0

Lorsque cette est terminé, j'aimerais bien que vous m'envoyiez un haiku sympa: D – Aaron3468

Répondre

1

Utilisez str.join() comme ceci:

def writeToFile(): 
    with open("results.txt", "w") as fp: 
     fp.write('{}\n'.format('\n\n'.join(['\n'.join(haiku) for haiku in haikuList]))) 
     print "There are {} lines in your file.".format(len(haikuList)*3 + len(haikuList)-1) 

Cette imprime chaque ligne de chaque haïku séparés par un seul caractère de nouvelle ligne. str.join() est également utilisé pour ajouter de nouvelles lignes entre chaque haïku. Avec file.write() vous devez ajouter dans la nouvelle ligne si vous le voulez, donc j'ai utilisé str.format() pour le faire.

Enfin, le nombre de lignes écrites dans le fichier sera le même que la longueur du haikuList multiplié par 3 plus len(haikuList) - 1 pour les nouvelles lignes entre chaque haiku, donc vous n'avez pas besoin d'un compteur pour cela.

Une autre chose, plutôt que l'accès à une variable externe à la fonction, vous devez passer la liste des haïkus dans la fonction writeToFile():

def writeToFile(haikuList): 
    with open("results.txt", "w") as fp: 
     fp.write('{}\n'.format('\n\n'.join(['\n'.join(haiku) for haiku in haikuList]))) 
     print "There are {} lines in your file.".format(len(haikuList)*3 + len(haikuList)-1) 

Ensuite, appelez comme ceci:

writeToFile(haikuList) 
+0

Salut, alors peut-être que j'ai formulé ma question un peu faux. Cela fonctionne super en termes de chaque haïku sur des lignes distinctes. Cependant, je cherche une ligne vide entre chaque haïku et aussi pour chaque ligne du haïku sur une ligne séparée. Je suis en train d'éditer ma question pour le rendre plus clair! – natalien

+0

@natalien: vous pourriez essayer d'adapter la réponse à votre changement d'exigences. J'ai mis à jour la réponse qui consiste à utiliser ''\ n'.join()' au lieu de '' '.join()' et à ajouter une nouvelle ligne entre haikus. – mhawke

+0

ouais, j'étais juste confus sur la façon d'organiser cela. Merci! – natalien

1

Mettre un fp.write("\n") après la boucle for line; ceci ajoutera une ligne vide à la fin de chaque haïku. Si vous devez ajouter un espace après chaque élément, vous pouvez ajouter fp.write(" ") après fp.write(str(item)).

+0

ou 'fp.write (''.join (line)) '(il pourrait utiliser' len (items) 'au lieu d'incrémenter de un pour chaque item) – SwiftsNamesake

1

En supposant que chaque haïku de votre liste de haïkus est un list de str ou unicode, vous pourriez faire quelque chose comme ceci de façon plus concise.

def writeToFile(): 
    with open("results.txt", "w") as fp: 
     count = 0 
     for haiku in haikuList: 
      fp.write(" ".join(haiku) + "\n"): 
      count += len(haiku) 
     print "There are", count, "lines in your file." 
+0

Merci pour votre réponse! J'ai fait quelques modifications à ma question. Réalisé que je n'étais pas si clair avant! – natalien