Come posso specificare nuove linee su Python, quando scrivo su file?


314

In confronto a Java (in una stringa), faresti qualcosa di simile "First Line\r\nSecond Line".

Quindi come lo faresti in Python, allo scopo di scrivere più righe in un normale file?


12
Che cosa hai provato? Ha funzionato? (Suppongo di no, o non te lo chiederesti.) Cosa è successo?
Greg Hewgill,

Volevo solo sapere se c'era un modo giusto e un modo sbagliato di farlo, ma non ci avevo ancora provato.
FabianCook,

5
Ti rendi conto che Python printfunziona come System.out.printlnin Java e aggiunge automaticamente una nuova riga dopo il testo, giusto?
Greg Hewgill,

Lo voglio per scrivere file :)
FabianCook,

2
L' printistruzione in Python può anche essere usata per scrivere su file (i dettagli differiscono tra Python 2.xe Python 3.x, quindi controlla con i documenti di riferimento per la tua versione). printin Python 2.x - printin Python 3.x
Greg Hewgill il

Risposte:


357

Dipende da quanto vuoi essere corretto. \ndi solito farà il lavoro. Se vuoi davvero farlo bene, cerchi il carattere newline nel ospacchetto . (In realtà si chiama linesep.)

Nota: quando si scrive su file utilizzando l'API Python, non utilizzare os.linesep. Basta usare \n; Python lo traduce automaticamente nel carattere di nuova riga appropriato per la tua piattaforma.


14
Dal collegamento fornito "Non utilizzare os.linesep come terminatore di riga quando si scrivono file aperti in modalità testo (impostazione predefinita); utilizzare invece un singolo '\ n', su tutte le piattaforme." Quindi cosa intendi per "giusto" e quali sono le ragioni del loro e del tuo commento?
Yasen,

21
@Yasen: su Windows, la sequenza newline è "\r\n". Questo significa che os.lineseplo sarà "\r\n". Quando si scrive su un file in modalità testo, esegue la traduzione di nuova riga mentre scrive; vale a dire, ciascuno "\n"nell'output verrà tradotto "\r\n"nel file risultante. Puoi vedere come questo sia un problema se il testo che stai scrivendo contiene già "\r\n"sequenze: il risultato sarà "\r\r\n"alla fine di ogni riga. Presumo, almeno: in realtà non l'ho provato.
Nate CK,

Potrebbe essere il momento di risolvere la risposta già e rimuovere la os.linesepproposta sbagliata , no? Non sarebbe un grande dramma e l'orgoglio dell'autore non soffrirebbe molto credo
ZAB

8
Non conosci il mio orgoglio. Ma più seriamente, penso che sia utile notare che linesepc'è ed esiste in modo da poter scoprire qual è il separatore di linea di sistema.
Charlie Martin,

2
@ZAB Non tutte le stringhe sono scritte su file in modalità testo. lineseppuò ancora essere utile.
Kyle Strand,

63

Il nuovo carattere di linea è \n. È usato all'interno di una stringa.

Esempio:

    print('First line \n Second line') 

dov'è \nil personaggio newline.

Ciò produrrebbe il risultato:

First line
 Second line

Se usi Python 2, non usi le parentesi sulla funzione di stampa.


7
come suggerimento, se non diamo uno 'spazio bianco' dopo \ n non otteniamo un rientro di spazio nella seconda riga. quello che volevo dire è: stampare 'Prima riga \ nSeconda riga'
Manoj Kumar

Grazie per aver sottolineato di usare il carattere "\ n" evaso all'interno di una stringa! Forse non è ovvio per i nuovi ragazzi di Python come me
GrayedFox,

3
@ all / anyone / ManojKumar a = 1; b = 2; stampare (a, "\ n", b); o / p: 1 2 (2 è su una nuova riga con un rientro di uno spazio bianco, ma non sta osservando correttamente ma supponiamo che 1 e 2 su righe separate con un rientro di uno spazio bianco su 2) In questo caso come rimuoverò lo spazio intero (uno spazio indent) prima di 2 e indicheremo con 1. Nota: non useremo 2 istruzioni di stampa e 1 e 2 saranno su linee separate (nuove).
PRAFUL ANAND

24

Puoi scrivere nelle nuove righe separatamente o all'interno di una singola stringa, il che è più semplice.

Esempio 1

Ingresso

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

Puoi scrivere '\ n' separatamente:

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

Produzione

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

Esempio 2

Ingresso

Come altri hanno sottolineato nelle risposte precedenti, posiziona \ n nei punti pertinenti della stringa:

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

file.write(line)

Produzione

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

Penso che il tuo output sia tecnicamente errato. La seconda e la terza riga dovrebbero essere stampate con uno spazio bianco a sinistra dei loro primi caratteri. Un'altra soluzione sarebbe quella di rimuovere questi due spazi dalla variabile di linea.
Christian Westbrook,

Ad ogni modo, il codice nell'esempio due non produrrebbe l'output esatto che hai visualizzato.
Christian Westbrook,

10

Se stai inserendo più righe di testo contemporaneamente, trovo che questo sia il formato più leggibile.

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\
")

Il \ alla fine di ogni riga sfugge alla nuova riga (che causerebbe un errore).


La tua parentesi interna, quindi non è necessario sfuggire alle linee. Basta terminare la stringa, passare a una nuova riga e avviarne una nuova. Non ci saranno nuove linee aggiuntive e non dovrai scappare. Inoltre, anche se hai fatto quanto sopra, il nuovo carattere di linea e la fuga si annullano a vicenda.
user144153

9

In Python puoi semplicemente usare il carattere di nuova riga, ad es \n


3
@maazza: non è la domanda sulla scrittura ?
mhawke,

9

Soluzione più semplice

Se chiami solo printsenza argomenti, verrà generata una riga vuota.

print

Puoi convogliare l'output in un file come questo (considerando il tuo esempio):

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

Non solo è OS-agnostico (senza nemmeno dover usare il ospacchetto), è anche più leggibile che mettere \ndentro le stringhe.

Spiegazione

La print()funzione ha un argomento di parola chiave facoltativo per la fine della stringa, chiamato end, che per impostazione predefinita assume il carattere di nuova riga del sistema operativo, ad es. \n. Quindi, quando chiami print('hello'), Python sta effettivamente stampando 'hello' + '\n'. Ciò significa che quando chiami printsenza alcun argomento, in realtà sta stampando '' + '\n', il che si traduce in una nuova riga.

Alternativa

Usa stringhe multilinea.

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

6

Interruttore di linea indipendente dalla piattaforma: Linux, windows e IOS

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

Produzione:

physical
distancing

4

Allo stesso modo '\n', anche se probabilmente non avresti bisogno di '\r'. C'è un motivo per averlo nella tua versione Java? Se ne hai bisogno / desideri, puoi usarlo allo stesso modo anche in Python.


1
\rè il ritorno a \r\n
capo

4
@SmartLemon: Questo è probabilmente vero su Windows, ma sulla maggior parte degli altri sistemi \nè l'unico carattere di nuova riga.
Greg Hewgill,

@ Jean-MichaëlCelerier: era vero prima di Mac OS X. Mac OS X lo utilizza \n.
Greg Hewgill,

Ok, rimuoverò il mio commento, allora è davvero inutile. Scusa!
Jean-Michaël Celerier,

4

\ n - l'inserimento di caratteri newline semplice funziona:

# 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.....

2

La maggior parte dei caratteri di escape nei letterali stringa da Java sono validi anche in Python, come "\ r" e "\ n".


perché Python e Java erano influenzati da C e provenivano da questo linguaggio. Per maggiori informazioni .
Alex.K.

1

Come menzionato in altre risposte: "Il carattere di nuova riga è \ n. Viene utilizzato all'interno di una stringa".

Ho trovato che il modo più semplice e leggibile è usare la funzione "format", usando nl come nome per la nuova riga, e spezzare la stringa che si desidera stampare nel formato esatto in cui la si stampa:

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

Questo produrrà:

line1
line2
line3

In questo modo esegue l'attività e offre anche un'alta leggibilità del codice :)


0

\ n separa le linee di una stringa. Nel seguente esempio, continuo a scrivere i record in un ciclo. Ogni record è separato da \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()

0

Vale la pena notare che quando si ispeziona una stringa utilizzando la shell interattiva in pitone o un notebook Jupyter, le \ne altre stringhe rovesciate come \tvengono visualizzate letteralmente :

>>> 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!'

Le nuove linee, le schede e altri caratteri speciali non stampati vengono visualizzati come spazi bianchi solo quando stampati o scritti in un file:

>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
    Yet even more great stuff!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.