¿Cómo especifico nuevas líneas en Python cuando escribo en archivos?

314

En comparación con Java (en una cadena), haría algo como "First Line\r\nSecond Line".

Entonces, ¿cómo haría eso en Python para escribir varias líneas en un archivo normal?

FabianCook
fuente
12
Que has intentado ¿Funcionó? (Supongo que no, o no estarías preguntando). ¿Qué pasó?
Greg Hewgill
Solo quería saber si había una forma correcta o incorrecta de hacerlo, aunque todavía no lo había intentado.
FabianCook
55
Te das cuenta de que Python printfunciona como System.out.printlnen Java y agrega automáticamente una nueva línea después del texto, ¿verdad?
Greg Hewgill
Lo quiero para escribir archivos :)
FabianCook
2
La printdeclaración en Python también se puede usar para escribir en archivos (los detalles difieren entre Python 2.xy Python 3.x, así que verifique con los documentos de referencia para su versión). printen Python 2.x - printen Python 3.x
Greg Hewgill

Respuestas:

357

Depende de qué tan correcto quieras ser. \ngeneralmente hará el trabajo. Si realmente quiere hacerlo bien, busque el carácter de nueva línea en el ospaquete . (En realidad se llama linesep).

Nota: cuando escriba en archivos usando la API de Python, no use el os.linesep. Solo usa \n; Python lo traduce automáticamente al carácter de nueva línea adecuado para su plataforma.

Charlie Martin
fuente
14
Desde el enlace que proporcionó "No use os.linesep como un terminador de línea cuando escriba archivos abiertos en modo de texto (el valor predeterminado); use un solo '\ n' en su lugar, en todas las plataformas". Entonces, ¿qué quiere decir con "correcto" y cuáles son los motivos de su comentario y el suyo?
Yasen
21
@Yasen: en Windows, la secuencia de nueva línea es "\r\n". Esto significa que os.linesepserá "\r\n". Cuando escribe en un archivo en modo de texto, realiza una traducción de nueva línea a medida que escribe; es decir, cada uno "\n"de los resultados se traducirá "\r\n"en el archivo resultante. Puede ver cómo esto es un problema si el texto que está escribiendo ya contiene "\r\n"secuencias: el resultado estará "\r\r\n"al final de cada línea. Asumo, al menos: en realidad no lo he probado.
Nate CK
Puede ser el momento de arreglar la respuesta ya y eliminar la os.lineseppropuesta incorrecta , ¿no? No sería un gran drama y el orgullo del autor no sufriría mucho, creo
ZAB
8
No conoces mi orgullo. Pero más en serio, creo que es útil tener en cuenta que linesepexiste y existe para que pueda averiguar cuál es el separador de línea del sistema.
Charlie Martin el
2
@ZAB No todas las cadenas se escriben en archivos en modo de texto. linesepTodavía puede ser útil.
Kyle Strand
63

El nuevo carácter de línea es \n. Se usa dentro de una cadena.

Ejemplo:

    print('First line \n Second line') 

¿Dónde \nestá el personaje de nueva línea?

Esto produciría el resultado:

First line
 Second line

Si usa Python 2, no usa los paréntesis en la función de impresión.

python_powered
fuente
77
solo como sugerencia, si no le damos un "espacio en blanco" después de \ n, no obtenemos una sangría de espacio en la segunda línea. lo que quise decir es: imprimir 'Primera línea \ nSegunda línea'
Manoj Kumar
¡Gracias por indicarnos que usen el carácter "\ n" escapado dentro de una cadena! Quizás no sea obvio para los nuevos niños de Python como yo
GrayedFox
3
@ all / anyone / ManojKumar a = 1; b = 2; print (a, "\ n", b); o / p: 1 2 (2 está en una nueva línea con una sangría de espacio en blanco no se ve correctamente, pero suponga que 1 y 2 en líneas separadas con una sangría de espacio en blanco en 2) En este caso, ¿cómo eliminaré el espacio en blanco? sangría de espacio) antes de 2 y sangrará con 1. Nota: no utilizaremos 2 declaraciones de impresión y 1 y 2 estarán en líneas separadas (nuevas).
PRAFUL ANAND
24

Puede escribir en las nuevas líneas por separado o dentro de una sola cadena, lo que es más fácil.

Ejemplo 1

Entrada

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

Puede escribir el '\ n' por separado:

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

Salida

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

Ejemplo 2

Entrada

Como otros han señalado en las respuestas anteriores, coloque el \ n en los puntos relevantes de su cadena:

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

file.write(line)

Salida

hello how are you
I am testing the new line escape sequence
this seems to work
Homam Bahrani
fuente
Creo que su salida es técnicamente incorrecta. La segunda y tercera línea deben imprimirse con un espacio en blanco a la izquierda de sus primeros caracteres. Otra solución sería eliminar estos dos espacios de la variable de línea.
Christian Westbrook
En cualquier caso, el código del ejemplo dos no produciría el resultado exacto que ha mostrado.
Christian Westbrook
10

Si está ingresando varias líneas de texto a la vez, creo que este es el formato más legible.

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

El \ al final de cada línea escapa a la nueva línea (lo que causaría un error).

fredcallaway
fuente
Su paréntesis interno, por lo que no es necesario escapar de las líneas. Simplemente finalice la cadena, muévase a una nueva línea y comience una nueva. No habrá nuevas líneas adicionales y no necesitarás escapar. Además, incluso si hiciste lo anterior, el nuevo carácter de línea y escape simplemente se cancelan entre sí.
user144153
9

En Python puedes usar el carácter de nueva línea, es decir \n

mhawke
fuente
3
@maazza: ¿no es la pregunta sobre escribir ?
mhawke
9

La solución más simple

Si solo llama printsin ningún argumento, generará una línea en blanco.

print

Puede canalizar la salida a un archivo como este (considerando su ejemplo):

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

No solo es independiente del sistema operativo (sin siquiera tener que usar el ospaquete), sino que también es más legible que ponerlo \ndentro de las cadenas.

Explicación

La print()función tiene un argumento de palabra clave opcional para el final de la cadena, llamado end, que por defecto es el carácter de nueva línea del sistema operativo, por ejemplo. \n. Entonces, cuando llamas print('hello'), Python está imprimiendo 'hello' + '\n'. Lo que significa que cuando llama printsin ningún argumento, en realidad se imprime '' + '\n', lo que da como resultado una nueva línea.

Alternativa

Use cadenas de varias líneas.

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

Interruptor de línea independiente de la plataforma: Linux, Windows e IOS

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

Salida:

physical
distancing
Bandham Manikanta
fuente
4

De la misma manera '\n', aunque probablemente no necesites el '\r'. ¿Hay alguna razón por la que lo tienes en tu versión de Java? Si lo necesita / desea, puede usarlo de la misma manera en Python también.

Levon
fuente
1
\res el retorno de carro, cuando obtiene la propiedad del sistema para la nueva línea aparece como\r\n
FabianCook
44
@SmartLemon: Eso probablemente sea cierto en Windows, pero en la mayoría de los otros sistemas \nes el único personaje de nueva línea.
Greg Hewgill
@ Jean-MichaëlCelerier: Eso era cierto antes de Mac OS X. Mac OS X usa \n.
Greg Hewgill
Ok, eliminaré mi comentario, entonces es realmente inútil. ¡Lo siento!
Jean-Michaël Celerier
4

\ n - la inserción de caracteres de nueva línea simple funciona:

# 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
fuente
2

La mayoría de los caracteres de escape en literales de cadena de Java también son válidos en Python, como "\ r" y "\ n".

dolaameng
fuente
porque Python y Java fueron influenciados por C y les llegó de este lenguaje. Para obtener más información .
Alex.K.
1

Como se menciona en otras respuestas: "El nuevo carácter de línea es \ n. Se usa dentro de una cadena".

Encontré que la forma más simple y fácil de leer es usar la función "formato", usando nl como el nombre de la nueva línea, y dividir la cadena que desea imprimir en el formato exacto que va a imprimir:

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

Eso generará:

line1
line2
line3

De esta forma, realiza la tarea y también proporciona una alta legibilidad del código :)

Rea Haas
fuente
0

\ n separa las líneas de una cadena. En el siguiente ejemplo, sigo escribiendo los registros en un bucle. Cada registro está separado por \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
fuente
0

Vale la pena señalar que cuando inspecciona una cadena usando el shell interactivo de Python o un cuaderno Jupyter, las \ncadenas y otras barras con barra invertida como \tse representan literalmente :

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

Las nuevas líneas, pestañas y otros caracteres especiales no impresos se representan como espacios en blanco solo cuando se imprimen o se escriben en un archivo:

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