2011-09-24 4 views
4

Je voudrais éviter d'écrire un caractère de nouvelle ligne à la fin d'un fichier texte en python. C'est un problème que j'ai beaucoup, et je suis sûr que peut être réparé facilement. Voici un exemple:Éviter une nouvelle ligne à la fin du fichier - Python

fileout = open('out.txt', 'w') 
list = ['a', 'b', 'c', 'd'] 
for i in list: 
    fileout.write('%s\n' % (i)) 

Ceci imprime un caractère \ n à la fin du fichier. Comment puis-je modifier ma boucle pour éviter cela?

Répondre

8
fileout = open('out.txt', 'w') 
list = ['a', 'b', 'c', 'd'] 
fileout.write('\n'.join(list)) 
+0

Merci beaucoup! Nice and compact too ... – bac

1

À mon avis, un fichier texte se compose de lignes de texte. Les lignes sont terminées avec une séquence de saut de ligne, dont les détails exacts sont spécifiques à la plate-forme. Ainsi, un fichier texte approprié doit toujours contenir exactement 1 séquence de saut de ligne par ligne. Quoi qu'il en soit, vous pouvez probablement résoudre ceci en traitant la dernière ligne différemment, ou en créant le fichier entier en mémoire et en l'écrivant comme des données binaires, en omettant le ou les deux derniers octets, selon votre plate-forme. le format exact de la séquence d'alimentation.

1

Voici une solution qui évite de créer une chaîne intermédiaire, ce qui sera utile lorsque la taille de la liste est grande. Au lieu de s'inquiéter de la nouvelle ligne à la fin du fichier, il place la nouvelle ligne avant la ligne à imprimer, à l'exception de la première ligne, qui est traitée en dehors de la boucle for.

fileout = open('out.txt', 'w') 
mylist = ['a', 'b', 'c', 'd'] 
listiter = iter(mylist) 
for first in listiter: 
    fileout.write(first) 
    for i in listiter: 
     fileout.write('\n') 
     fileout.write(i) 
+0

L'indentation de la dernière boucle est-elle correcte? – 9000

+0

Oui; C'est un peu un truc; les deux boucles bouclent sur le même itérateur; puisque la boucle interne épuise l'itérateur avant que la boucle externe puisse exécuter sa deuxième itération, la boucle externe s'exécute au plus une fois; Si la liste est vide, aucune boucle ne s'exécute! – SingleNegationElimination

+0

Ne serait-il pas plus clair d'utiliser listiter.next() au lieu d'écrire le externalloop qui ne s'exécute qu'une seule fois? –

1

Si vous avez des listes vraiment longues que vous ne voulez pas convertir en une chaîne avec join(), bon vieux drapeau varaibles viennent à la rescousse:

is_first_line = True 
for s in my_list: 
    if is_first_line: 
    # see, no write() in this branch 
    is_first_line = False 
    else: 
    # we've just written a line; add a newline 
    output.write('\n') 
    output.write(s) 
+0

Merci! Oui, je traite un grand nombre de fichiers longs, donc ce sera utile. – bac

Questions connexes