Frage Python - write () versus writelines () und verkettete Strings


Also lerne ich Python. Ich gehe die Lektionen durch und stoße auf ein Problem, bei dem ich sehr viele verdichten musste target.write() in eine einzige write(), während a "\n" zwischen jeder Benutzereingabevariablen (das Objekt von write()).

Ich hatte die Idee dass:

nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)

Wenn ich versuche:

textdoc.write(lines)

Ich bekomme einen Fehler. Aber wenn ich tippe:

textdoc.write(line1 + "\n" + line2 + ....)

Dann funktioniert es gut. Warum kann ich keine Zeichenfolge für einen Zeilenumbruch verwenden? write() aber ich kann es benutzen writelines()?

Python 2.7 Als ich nach Google suchte, waren die meisten Ressourcen, die ich gefunden hatte, weit über meinem Kopf. Ich bin immer noch ein Laie.


76
2017-09-11 20:31


Ursprung


Antworten:


writelines erwartet eine Liste von Strings, während write erwartet eine einzelne Zeichenfolge.

line1 + "\n" + line2 fügt diese Zeichenfolgen zu einer einzelnen Zeichenfolge zusammen, bevor sie an sie übergeben wird write.

Beachten Sie, dass Sie möglicherweise mehrere Zeilen verwenden möchten "\n".join(list_of_lines).


92
2017-09-11 20:36



Warum kann ich in write () keine Zeichenfolge für eine neue Zeile verwenden, aber ich kann sie in den writelines () verwenden?

Die Idee ist folgende: Wenn Sie eine einzelne Zeichenfolge schreiben möchten, können Sie dies mit tun write(). Wenn Sie eine Folge von Strings haben, können Sie sie alle mit schreiben writelines().

write(arg) erwartet eine Zeichenfolge als Argument und schreibt sie in die Datei. Wenn Sie eine Liste von Strings angeben, wird eine Ausnahme ausgelöst (übrigens, zeigen Sie uns Fehler!).

writelines(arg) erwartet ein iterables as Argument (ein iterables Objekt kann ein Tupel, eine Liste, eine Zeichenfolge oder ein Iterator im allgemeinsten Sinne sein). Es wird erwartet, dass jedes im Iterator enthaltene Element eine Zeichenfolge ist. Ein Tupel von Strings ist das, was du bereitgestellt hast, also haben die Dinge funktioniert.

Die Art der Zeichenfolge (n) ist für beide Funktionen nicht von Bedeutung, d. H. Sie schreiben nur in die Datei, was auch immer Sie ihnen zur Verfügung stellen. Der interessante Teil ist das writelines() fügt nicht automatisch Newline-Zeichen hinzu, so dass der Methodenname tatsächlich ziemlich verwirrend sein kann. Es verhält sich tatsächlich wie eine imaginäre Methode namens write_all_of_these_strings(sequence).

Was folgt, ist eine idiomatische Methode in Python, eine Liste von Strings in eine Datei zu schreiben, während jeder String in einer eigenen Zeile bleibt:

lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
    f.write('\n'.join(lines))

Dies sorgt dafür, dass die Datei für Sie geschlossen wird. Das Konstrukt '\n'.join(lines) verkettet (verbindet) die Strings in der Liste lines und verwendet das Zeichen '\ n' als Leim. Es ist effizienter als die Verwendung der + Operator.

Ausgehend von demselben lines Sequenz, endet mit der gleichen Ausgabe, aber mit writelines():

lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
    f.writelines("%s\n" % l for l in lines)

Dies verwendet einen Generatorausdruck und erzeugt dynamisch Newline-terminierte Strings. writelines() Iteriert diese Zeichenfolge und schreibt jedes Element.

Bearbeiten: Ein weiterer Punkt, den Sie beachten sollten:

write() und readlines() existierte vorher writelines() wurde vorgestellt. writelines() wurde später als Gegenstück von readlines(), damit man leicht den Dateiinhalt schreiben kann, der gerade gelesen wurde readlines():

outfile.writelines(infile.readlines())

Wirklich, das ist der Hauptgrund warum writelines hat solch einen verwirrenden Namen. Auch heute wollen wir diese Methode nicht mehr verwenden. readlines() liest die gesamte Datei im Speicher Ihres Rechners vor writelines() beginnt mit dem Schreiben der Daten. Vor allem kann dies Zeit verschwenden. Warum nicht anfangen, Teile von Daten zu schreiben, während andere Teile gelesen werden? Aber vor allem kann dieser Ansatz sehr speicherintensiv sein. In einem extremen Szenario, in dem die Eingabedatei größer ist als der Arbeitsspeicher Ihres Computers, funktioniert dieser Ansatz nicht einmal. Die Lösung für dieses Problem besteht darin, nur Iteratoren zu verwenden. Ein funktionierendes Beispiel:

with open('inputfile') as infile:
    with open('outputfile') as outfile:
        for line in infile:
            outfile.write(line)

Dies liest die Eingabedatei Zeile für Zeile. Sobald eine Zeile gelesen wird, wird diese Zeile in die Ausgabedatei geschrieben. Schematisch gesprochen gibt es immer nur eine einzige Zeile im Speicher (verglichen mit dem gesamten Dateiinhalt, der im Falle der Lesezeilen / Schreibzeilen-Vorgehensweise im Speicher ist).


90
2017-09-11 20:40



Eigentlich glaube ich das Problem ist, dass deine Variable "Zeilen" schlecht ist. Sie haben Zeilen als Tupel definiert, aber ich glaube, dass write () eine Zeichenkette benötigt. Alles, was du ändern musst, sind deine Kommas in Pluszeichen (+).

nl = "\n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)

sollte arbeiten.


-2
2017-09-17 22:18



Wenn Sie nur eine Liste speichern und laden möchten, versuchen Sie es Essiggurke

Pickle speichern:

with open("yourFile","wb")as file:
 pickle.dump(YourList,file)

und laden:

with open("yourFile","rb")as file:
 YourList=pickle.load(file)

-2
2018-03-11 15:29



Übung 16 aus Zed Shaws Buch? Sie können Escape-Zeichen wie folgt verwenden:

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()

-2
2018-02-06 07:30