web-dev-qa-db-fra.com

Comment écrire une liste de chaînes dans un fichier en ajoutant des nouvelles lignes?

def generator():
    nums = ['09', '98', '87', '76', '65', '54', '43']
    s_chars = ['*', '&', '^', '%', '$', '#', '@',]

    data = open("list.txt", "w")
    for c in s_chars:
        for n in nums:
            data.write(c + n)
    data.close()

Je voudrais ajouter une nouvelle ligne après chaque "c + n".

12
b1ackzer0

Changement

data.write(c + n)

à

data.write("%s%s\n" % (c, n))
17
dietbuddha

Un data.write('\n') correctement placé gérera cela. Il suffit de l'indenter de manière appropriée pour la boucle que vous voulez ponctuer.

5

Comme d'autres réponses l'ont déjà souligné, vous pouvez le faire en ajoutant un '\ n' à c+n ou en utilisant la chaîne de formatage "% s% s\n".

À titre d’intérêt, je pense que ce serait plus pythonique d’utiliser une liste de compréhension au lieu de deux boucles imbriquées:

data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums))
4
MAK

Changement

data.write(c+n)

à

data.write(c+n+'\n')
1
Marc Poulin

print de Python est la fonction standard "print with newline".

Par conséquent, vous pouvez le faire directement si vous utilisez Python 2.x:

print  >> data, c+n

Si vous utilisez Python 3.x:

print(c+n, file=data)
1
Eric O Lebigot

Pousser plus de travail vers la couche C avec writelines et product:

from future_builtins import map  # Only do this on Python 2; makes map generator function
import itertools

def generator():
    nums = ['09', '98', '87', '76', '65', '54', '43']
    s_chars = ['*', '&', '^', '%', '$', '#', '@',]
    # Append newlines up front, to avoid doing the work len(nums) * len(s_chars) times
    # product will realize list from generator internally and discard values when done
    nums_newlined = (n + "\n" for s in nums)

    with open("list.txt", "w") as data:
        data.writelines(map(''.join, itertools.product(s_chars, nums_newlined)))

Cela produit le même effet que la boucle imbriquée, mais avec les modifications intégrées implémentées en C (dans l’interpréteur de référence CPython de toute façon), en supprimant la surcharge d’exécution du code octet de l’image; cela peut améliorer considérablement les performances, en particulier pour les entrées plus volumineuses, et contrairement aux autres solutions impliquant '\n'.join de la sortie entière dans une seule chaîne pour effectuer un seul appel write, il est répété pendant son écriture, de sorte que l'utilisation de la mémoire reste fixe au lieu de vous obliger à réaliser. toute la sortie en mémoire en une seule fois dans une chaîne.

1
ShadowRanger

Celui-ci fonctionne pour moi 

with open(fname,'wb') as f:
    for row in var:
        f.write(repr(row)+'\n')
0
DACW