Wie spezifiziere ich neue Zeilen in Python, wenn ich in Dateien schreibe?

313

Im Vergleich zu Java (in einer Zeichenfolge) würden Sie so etwas tun "First Line\r\nSecond Line".

Wie würden Sie das in Python tun, um mehrere Zeilen in eine reguläre Datei zu schreiben?

FabianCook
quelle
12
Was hast du versucht? Hat es funktioniert? (Ich denke nicht, oder Sie würden nicht fragen.) Was ist passiert?
Greg Hewgill
Ich wollte nur wissen, ob es einen richtigen und einen falschen Weg gibt, aber ich hatte es noch nicht versucht.
FabianCook
5
Sie erkennen, dass Pythons printwie System.out.printlnin Java funktioniert und fügen nach dem Text automatisch eine neue Zeile hinzu, oder?
Greg Hewgill
Ich möchte es zum Schreiben von Dateien :)
FabianCook
2
Die printAnweisung in Python kann auch zum Schreiben in Dateien verwendet werden (die Details unterscheiden sich zwischen Python 2.x und Python 3.x, überprüfen Sie daher die Referenzdokumente für Ihre Version). printin Python 2.x - printin Python 3.x
Greg Hewgill

Antworten:

357

Es hängt davon ab, wie korrekt Sie sein möchten. \nwird in der Regel den Job machen. Wenn Sie es wirklich richtig machen möchten, schlagen Sie das Zeilenumbruchzeichen im osPaket nach . (Es heißt eigentlich linesep.)

Hinweis: Verwenden Sie beim Schreiben in Dateien mit der Python-API nicht die os.linesep. Verwenden Sie einfach \n; Python übersetzt dies automatisch in das richtige Zeilenumbruchzeichen für Ihre Plattform.

Charlie Martin
quelle
14
Über den von Ihnen angegebenen Link "Verwenden Sie os.linesep nicht als Zeilenabschluss, wenn Sie Dateien schreiben, die im Textmodus geöffnet wurden (Standardeinstellung). Verwenden Sie stattdessen auf allen Plattformen ein einzelnes '\ n'." Was meinst du mit "richtig" und was sind die Gründe für sie und deinen Kommentar?
Yasen
21
@Yasen: Unter Windows lautet die Zeilenumbruchsequenz "\r\n". Das heißt, das os.linesepwird sein "\r\n". Wenn Sie im Textmodus in eine Datei schreiben, wird beim Schreiben eine Zeilenumbruchübersetzung ausgeführt. Das heißt, jeder "\n"in der Ausgabe wird "\r\n"in die resultierende Datei übersetzt. Sie können sehen, dass dies ein Problem ist, wenn der Text, den Sie schreiben, bereits "\r\n"Sequenzen enthält : Das Ergebnis befindet sich "\r\r\n"am Ende jeder Zeile. Ich nehme zumindest an: Ich habe es nicht wirklich versucht.
Nate CK
Vielleicht ist es an der Zeit, die Antwort bereits zu korrigieren und den falschen os.linesepVorschlag zu entfernen , nein? Es wäre kein großes Drama und der Stolz des Autors würde nicht viel leiden, glaube ich
ZAB
8
Du kennst meinen Stolz nicht. Aber im Ernst, ich denke, es ist nützlich zu bemerken, dass linesepes da ist und existiert, damit Sie herausfinden können, was das Systemzeilentrennzeichen ist.
Charlie Martin
2
@ZAB Nicht alle Zeichenfolgen werden im Textmodus in Dateien geschrieben. linesepkann immer noch nützlich sein.
Kyle Strand
61

Das neue Zeilenzeichen ist \n. Es wird in einer Zeichenfolge verwendet.

Beispiel:

    print('First line \n Second line') 

Wo \nist das Zeilenumbruchzeichen?

Dies würde das Ergebnis ergeben:

First line
 Second line

Wenn Sie Python 2 verwenden, verwenden Sie die Klammern in der Druckfunktion nicht.

python_powered
quelle
7
Nur als Vorschlag: Wenn wir nach \ n kein 'Leerzeichen' angeben, erhalten wir in der zweiten Zeile keinen Leerzeicheneinzug. Was ich meinte ist: Drucken Sie 'Erste Zeile \ nSekunde Zeile'
Manoj Kumar
Vielen Dank, dass Sie darauf hingewiesen haben, das maskierte Zeichen "\ n" in einem String zu verwenden! Vielleicht nicht offensichtlich für neue Python-Kinder wie mich
GrayedFox
3
@ all / any / ManojKumar a = 1; b = 2; print (a, "\ n", b); o / p: 1 2 (2 befindet sich in einer neuen Zeile mit einem Leerzeicheneinzug. Es sieht nicht richtig aus, aber es wird davon ausgegangen, dass 1 und 2 in separaten Zeilen mit einem Leerzeicheneinzug auf 2 stehen.) Wie entferne ich in diesem Fall den Leerzeichen (eins)? Leerzeichen einrücken) vor 2 und wird mit 1 eingerückt. Hinweis: Wir verwenden keine 2 print-Anweisung und 1 und 2 stehen in separaten (neuen) Zeilen.
PRAFUL ANAND
24

Sie können die neuen Zeilen entweder separat oder innerhalb einer einzelnen Zeichenfolge schreiben, was einfacher ist.

Beispiel 1

Eingang

line1 = "hello how are you"
line2 = "I am testing the new line escape sequence"
line3 = "this seems to work"

Sie können das '\ n' separat schreiben:

file.write(line1)
file.write("\n")
file.write(line2)
file.write("\n")
file.write(line3)
file.write("\n")

Ausgabe

hello how are you
I am testing the new line escape sequence
this seems to work

Beispiel 2

Eingang

Platzieren Sie, wie andere in den vorherigen Antworten ausgeführt haben, das \ n an den relevanten Punkten in Ihrer Zeichenfolge:

line = "hello how are you\nI am testing the new line escape sequence\nthis seems to work"

file.write(line)

Ausgabe

hello how are you
I am testing the new line escape sequence
this seems to work
Homam Bahrani
quelle
Ich denke, Ihre Ausgabe ist technisch falsch. Die zweite und dritte Zeile sollten mit einem Leerzeichen links von den ersten Zeichen gedruckt werden. Eine andere Lösung wäre, diese beiden Leerzeichen aus der Linienvariablen zu entfernen.
Christian Westbrook
In jedem Fall würde der Code in Beispiel zwei nicht die exakte Ausgabe erzeugen, die Sie angezeigt haben.
Christian Westbrook
10

Wenn Sie mehrere Textzeilen gleichzeitig eingeben, ist dies das am besten lesbare Format.

file.write("\
Life's but a walking shadow, a poor player\n\
That struts and frets his hour upon the stage\n\
And then is heard no more: it is a tale\n\
Told by an idiot, full of sound and fury,\n\
Signifying nothing.\n\
")

Das \ am Ende jeder Zeile wird aus der neuen Zeile entfernt (was einen Fehler verursachen würde).

Fredcallaway
quelle
Ihre innere Klammer, so dass das Entkommen von Linien nicht erforderlich ist. Beenden Sie einfach die Zeichenfolge, wechseln Sie zu einer neuen Zeile und beginnen Sie eine neue. Es gibt keine zusätzlichen neuen Zeilen und Sie müssen nicht entkommen. Auch wenn Sie dies oben getan haben, heben sich das neue Zeilenzeichen und das Escape-Zeichen einfach gegenseitig auf.
user144153
9

In Python können Sie einfach das Zeilenumbruchzeichen verwenden, d. H. \n

mhawke
quelle
3
@maazza: ist die Frage nicht über das Schreiben ?
Mhawke
9

Einfachste Lösung

Wenn Sie nur printohne Argumente aufrufen , wird eine leere Zeile ausgegeben.

print

Sie können die Ausgabe an eine Datei wie diese weiterleiten (anhand Ihres Beispiels):

f = open('out.txt', 'w')
print 'First line' >> f
print >> f
print 'Second line' >> f
f.close()

Es ist nicht nur OS-unabhängig (ohne das osPaket verwenden zu müssen), sondern auch besser lesbar als das Einfügen von \nZeichenfolgen.

Erläuterung

Die print()Funktion verfügt über ein optionales Schlüsselwortargument für das Ende der aufgerufenen Zeichenfolge end, das standardmäßig das Zeilenumbruchzeichen des Betriebssystems verwendet, z. \n. Wenn Sie anrufen print('hello'), druckt Python tatsächlich 'hello' + '\n'. Das heißt, wenn Sie nur printohne Argumente aufrufen , wird tatsächlich gedruckt '' + '\n', was zu einer neuen Zeile führt.

Alternative

Verwenden Sie mehrzeilige Zeichenfolgen.

s = """First line
    Second line
    Third line"""
f = open('out.txt', 'w')
print s >> f
f.close()
aalaap
quelle
6

Plattformunabhängiger Zeilenumbruch: Linux, Windows & IOS

import os
keyword = 'physical'+ os.linesep + 'distancing'
print(keyword)

Ausgabe:

physical
distancing
Bandham Manikanta
quelle
4

Genauso wie mit '\n', obwohl Sie das wahrscheinlich nicht brauchen würden '\r'. Gibt es einen Grund, warum Sie es in Ihrer Java-Version haben? Wenn Sie es brauchen / wollen, können Sie es auch in Python auf die gleiche Weise verwenden.

Levon
quelle
1
\rist Wagenrücklauf, wenn Sie die Systemeigenschaft für neue Zeile erhalten, erscheint sie als\r\n
FabianCook
4
@SmartLemon: Das stimmt wahrscheinlich unter Windows, aber auf den meisten anderen Systemen \nist dies das einzige Zeilenumbruchzeichen.
Greg Hewgill
@ Jean-MichaëlCelerier: Das war wahr, bevor Mac OS X verwendet wurde \n. Mac OS X.
Greg Hewgill
Ok, ich werde meinen Kommentar entfernen, dann ist es wirklich nutzlos. Es tut uns leid!
Jean-Michaël Celerier
4

\ n - Das einfache Einfügen von Zeilenumbrüchen funktioniert:

# Here's the test example - string with newline char:
In [36]: test_line = "Hi!!!\n testing first line.. \n testing second line.. \n and third line....."

# Output:
In [37]: print(test_line)

Hi!!!
 testing first line..
 testing second line..
 and third line.....
Surya
quelle
2

Die meisten Escape-Zeichen in String-Literalen aus Java sind auch in Python gültig, z. B. "\ r" und "\ n".

dolaameng
quelle
weil Python und Java von C beeinflusst wurden und es aus dieser Sprache zu ihnen kam. Für weitere Informationen .
Alex.K.
1

Wie in anderen Antworten erwähnt: "Das neue Zeilenzeichen ist \ n. Es wird in einer Zeichenfolge verwendet."

Ich fand, dass der einfachste und lesbarste Weg darin besteht, die Funktion "Format" zu verwenden, wobei nl als Name für die neue Zeile verwendet wird, und die zu druckende Zeichenfolge in das genaue Format zu unterbrechen, in dem Sie sie drucken möchten:

print("line1{nl}"
      "line2{nl}"
      "line3".format(nl="\n"))

Das wird ausgegeben:

line1
line2
line3

Auf diese Weise führt es die Aufgabe aus und bietet auch eine hohe Lesbarkeit des Codes :)

Rea Haas
quelle
0

\ n trennt die Zeilen einer Zeichenfolge. Im folgenden Beispiel schreibe ich die Datensätze in einer Schleife. Jeder Datensatz wird durch getrennt \n.

f = open("jsonFile.txt", "w")

for row_index in range(2, sheet.nrows):

  mydict1 = {
    "PowerMeterId" : row_index + 1,
    "Service": "Electricity",
    "Building": "JTC FoodHub",
    "Floor": str(Floor),
    "Location": Location,
    "ReportType": "Electricity",
    "System": System,
    "SubSystem": "",
    "Incomer": "",
    "Category": "",
    "DisplayName": DisplayName,
    "Description": Description,
    "Tag": tag,
    "IsActive": 1,
    "DataProviderType": int(0),
    "DataTable": ""
  }
  mydict1.pop("_id", None)
  f.write(str(mydict1) + '\n')

f.close()
Sachintha Nayanajith
quelle
0

Beachten Sie, dass beim Überprüfen einer Zeichenfolge mithilfe der interaktiven Python-Shell oder eines Jupyter-Notizbuchs die \nund andere Zeichenfolgen mit umgekehrten Schrägstrichen buchstäblich\t gerendert werden :

>>> gotcha = 'Here is some random message...'
>>> gotcha += '\nAdditional content:\n\t{}'.format('Yet even more great stuff!')
>>> gotcha
'Here is some random message...\nAdditional content:\n\tYet even more great stuff!'

Die Zeilenumbrüche, Tabulatoren und anderen nicht gedruckten Sonderzeichen werden nur beim Drucken oder Schreiben in eine Datei als Leerzeichen gerendert :

>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
    Yet even more great stuff!
Trutane
quelle