it-swarm.com.de

Wie schreibe ich eine Liste von Strings in eine Datei und füge neue Zeilen hinzu?

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()

Ich möchte nach jedem "c + n" eine neue Zeile einfügen.

12
b1ackzer0

Veränderung

data.write(c + n)

zu

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

Eine korrekt platzierte data.write('\n') wird das erledigen. Richten Sie es einfach passend für die Schleife ein, die Sie markieren möchten.

Wie bereits in anderen Antworten erwähnt, können Sie dies durch Anhängen eines '\ n' an c+n oder durch Verwendung der Formatzeichenfolge "% s% s\n" tun.

Ich bin der Meinung, dass es mehr Pythonic wäre, ein Listenverständnis anstelle von zwei verschachtelten Schleifen zu verwenden:

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

Veränderung

data.write(c+n)

zu

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

Die print von Python ist die Standardfunktion "Drucken mit Zeilenumbruch".

Wenn Sie Python 2.x verwenden, können Sie dies direkt tun:

print  >> data, c+n

Wenn Sie Python 3.x verwenden:

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

Mehr Arbeit auf die C-Ebene mit writelines und 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)))

Dies hat den gleichen Effekt wie die geschachtelte Schleife, jedoch mit eingebauten C, die in C implementiert sind (im CPython-Referenzinterpreter sowieso), wodurch der Bytecode-Ausführungsaufwand aus dem Bild entfernt wird. Dies kann die Leistung erheblich verbessern, insbesondere bei größeren Eingaben. Anders als bei anderen Lösungen, bei denen '\n'.join der gesamten Ausgabe in einen einzigen String für einen einzelnen write-Aufruf ausgeführt wird, wird der Schreibvorgang durchlaufen, so dass die Spitzenspeicherauslastung nicht behoben wird, sondern dass der Arbeitsspeicher fest bleibt die gesamte Ausgabe im Speicher auf einmal in einer einzigen Zeichenfolge.

1
ShadowRanger

Dieser arbeitet für mich 

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