In vergelijking met Java (in een string), zou je zoiets doen als "First Line\r\nSecond Line"
.
Dus hoe zou je dat doen in Python, om meerdere regels naar een gewoon bestand te schrijven?
Antwoord 1, autoriteit 100%
Het hangt ervan af hoe correct je wilt zijn. \n
zal meestal het werk doen. Als je het echt goed wilt doen, zoek je het teken van de nieuwe regel op in de os
pakket. (Het heet eigenlijk linesep
.)
Opmerking: wanneer u naar bestanden schrijft met behulp van de Python API, gebruik dan niet de os.linesep
. Gebruik gewoon \n
; Python vertaalt dat automatisch naar het juiste nieuwe regelteken voor uw platform.
Antwoord 2, autoriteit 22%
Het nieuwe regelteken is \n
. Het wordt gebruikt in een string.
Voorbeeld:
print('First line \n Second line')
waarbij \n
het teken van de nieuwe regel is.
Dit zou het resultaat opleveren:
First line
Second line
Als je Python 2 gebruikt, gebruik je de haakjes in de afdrukfunctie niet.
Antwoord 3, autoriteit 6%
Je kunt de nieuwe regels afzonderlijk of binnen een enkele tekenreeks schrijven, wat gemakkelijker is.
Voorbeeld 1
Invoer
line1 = "hello how are you"
line2 = "I am testing the new line escape sequence"
line3 = "this seems to work"
Je kunt de ‘\n’ apart schrijven:
file.write(line1)
file.write("\n")
file.write(line2)
file.write("\n")
file.write(line3)
file.write("\n")
Uitvoer
hello how are you
I am testing the new line escape sequence
this seems to work
Voorbeeld 2
Invoer
Zoals anderen hebben aangegeven in de vorige antwoorden, plaats de \n op de relevante punten in uw string:
line = "hello how are you\nI am testing the new line escape sequence\nthis seems to work"
file.write(line)
Uitvoer
hello how are you
I am testing the new line escape sequence
this seems to work
Antwoord 4, autoriteit 4%
Platformonafhankelijke regelonderbreker: Linux,windows & IOS
import os
keyword = 'physical'+ os.linesep + 'distancing'
print(keyword)
Uitvoer:
physical
distancing
Antwoord 5, autoriteit 3%
EDIT: ik ben nu ouder en wijzer. Hier is een beter leesbare oplossing die correct werkt, zelfs als u niet op het hoogste niveau bent inspringen (bijvoorbeeld in een functiedefinitie).
import textwrap
file.write(textwrap.dedent("""
Life's but a walking shadow, a poor player
That struts and frets his hour upon the stage
And then is heard no more: it is a tale
Told by an idiot, full of sound and fury,
Signifying nothing.
"""))
oorspronkelijk antwoord
Als je meerdere regels tekst tegelijk invoert, vind ik dit het meest leesbare formaat.
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\
")
De \ aan het einde van elke regel ontsnapt aan de nieuwe regel (wat een fout zou veroorzaken).
Antwoord 6, autoriteit 3%
Eenvoudigste oplossing
Als u alleen print
aanroept zonder enige argumenten, wordt een lege regel weergegeven.
print
U kunt de uitvoer naar een bestand als dit doorsluizen (gezien uw voorbeeld):
f = open('out.txt', 'w')
print 'First line' >> f
print >> f
print 'Second line' >> f
f.close()
Het is niet alleen OS-onafhankelijk (zonder zelfs het pakket os
te hoeven gebruiken), het is ook beter leesbaar dan het plaatsen van \n
tussen strings.
Uitleg
De functie print()
heeft een optioneel trefwoordargument voor het einde van de tekenreeks, genaamd end
, dat standaard het nieuwe regelteken van het besturingssysteem is, voor bijv. \n
. Dus als je print('hello')
aanroept, drukt Python eigenlijk 'hello' + '\n'
af. Wat betekent dat wanneer je gewoon print
aanroept zonder enige argumenten, het eigenlijk '' + '\n'
afdrukt, wat resulteert in een nieuwe regel.
Alternatief
Gebruik tekenreeksen met meerdere regels.
s = """First line
Second line
Third line"""
f = open('out.txt', 'w')
print s >> f
f.close()
Antwoord 7, autoriteit 2%
In Python kun je gewoon het nieuwe-regelteken gebruiken, d.w.z. \n
Antwoord 8
Dezelfde manier met '\n'
, hoewel je de '\r'
waarschijnlijk niet nodig hebt. Is er een reden waarom je het in je Java-versie hebt? Als je het nodig hebt/wilt, kun je het ook in Python op dezelfde manier gebruiken.
Antwoord 9
Zoals vermeld in andere antwoorden: "Het nieuwe regelteken is \n. Het wordt gebruikt in een string".
Ik ontdekte dat de meest eenvoudige en leesbare manier is om het "format" functie, gebruik nl als de naam voor een nieuwe regel, en breek de tekenreeks die u wilt afdrukken naar het exacte formaat dat u gaat afdrukken:
python2:
print("line1{nl}"
"line2{nl}"
"line3".format(nl="\n"))
python3:
nl = "\n"
print(f"line1{nl}"
f"line2{nl}"
f"line3")
Dat levert het volgende op:
line1
line2
line3
Op deze manier voert het de taak uit en geeft het ook een hoge leesbaarheid van de code 🙂
Antwoord 10
De meeste escape-tekens in letterlijke tekenreeksen van Java zijn ook geldig in Python, zoals “\r” en “\n”.
Antwoord 11
\n – eenvoudige invoeging van nieuwe regeltekens werkt:
# 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.....
Antwoord 12
Het is vermeldenswaard dat wanneer u een string inspecteert met behulp van de interactieve python-shell of een Jupyter-notebook, de \n
en andere backslashed-strings zoals \t
worden weergegeven letterlijk:
>>> 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!'
De nieuwe regels, tabs en andere speciale niet-afgedrukte tekens worden alleen wanneer ze worden afgedrukt als witruimte weergegeven of naar een bestand geschreven:
>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
Yet even more great stuff!
Antwoord 13
\n scheidt de regels van een string. In het volgende voorbeeld blijf ik de records in een lus schrijven. Elk record wordt gescheiden door \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()
Antwoord 14
In Python 3 zorgt de taal voor het coderen van nieuwe regels voor u in de oorspronkelijke weergave van het platform. Dat betekent \r\n
op Windows en alleen \n
op volwassen systemen.
Zelfs op U*x-systemen levert het lezen van een bestand met Windows-regeleindes in tekstmodus correcte resultaten op voor tekst, dwz alle \r
-tekens vóór de \n
-tekens worden geruisloos neergezet.
Als je volledige controle over de bytes in het bestand nodig hebt, kun je de binaire modus gebruiken. Dan komt elke byte exact overeen met één byte en voert Python geen vertaling uit.
>>> # Write a file with different line endings, using binary mode for full control
>>> with open('/tmp/demo.txt', 'wb') as wf:
... wf.write(b'DOS line\r\n')
... wf.write(b'U*x line\n')
... wf.write(b'no line')
10
9
7
>>> # Read the file as text
>>> with open('/tmp/demo.txt', 'r') as text:
... for line in text:
... print(line, end='')
DOS line
U*x line
no line
>>> # Or more demonstrably
>>> with open('/tmp/demo.txt', 'r') as text:
... for line in text:
... print(repr(line))
'DOS line\n'
'U*x line\n'
'no line'
>>> # Back to bytes!
>>> with open('/tmp/demo.txt', 'rb') as binary:
... for line in binary:
... print(line)
b'DOS line\r\n'
b'U*x line\n'
b'no line'
>>> # Open in binary, but convert back to text
>>> with open('/tmp/demo.txt', 'rb') as binary:
... for line in binary:
... print(line.decode('utf-8'), end='')
DOS line
U*x line
no line
>>> # Or again in more detail, with repr()
>>> with open('/tmp/demo.txt', 'rb') as binary:
... for line in binary:
... print(repr(line.decode('utf-8')))
'DOS line\r\n'
'U*x line\n'
'no line'