Hoe specificeer ik nieuwe regels op Python, wanneer ik op bestanden schrijf?

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'

LEAVE A REPLY

Please enter your comment!
Please enter your name here

5 − 4 =

Other episodes