Como especifico novas linhas no Python, ao escrever em arquivos?

313

Em comparação com Java (em uma string), você faria algo como "First Line\r\nSecond Line".

Então, como você faria isso em Python, com o objetivo de gravar várias linhas em um arquivo regular?

FabianCook
fonte
12
O que você tentou? Funcionou? (Acho que não, ou você não perguntaria.) O que aconteceu?
Greg Hewgill
Eu só queria saber se havia uma maneira certa e errada de fazer isso, ainda não tinha tentado.
FabianCook
5
Você percebe que o Python printfunciona como System.out.printlnem Java e adiciona automaticamente uma nova linha após o texto, certo?
22812 Greg Hewgill
Eu quero isso para arquivos de escrita :)
FabianCook
2
A printinstrução no Python também pode ser usada para gravar arquivos (os detalhes diferem entre o Python 2.xe o Python 3.x, portanto, consulte os documentos de referência da sua versão). printem Python 2.x - printem Python 3.x
Greg Hewgill

Respostas:

357

Depende de quão correto você deseja ser. \nnormalmente fará o trabalho. Se você realmente deseja acertar, procure o caractere de nova linha no ospacote . (Na verdade, é chamado linesep.)

Nota: ao gravar em arquivos usando a API Python, não use o os.linesep . Apenas use \n; O Python traduz automaticamente isso para o caractere de nova linha apropriado para sua plataforma.

Charlie Martin
fonte
14
No link que você forneceu "Não use o os.linesep como terminador de linha ao gravar arquivos abertos no modo de texto (o padrão); use um único '\ n' em todas as plataformas". Então, o que você quer dizer com "certo" e quais são as razões para o comentário e o comentário deles?
Yasen
21
@ Yasen: No Windows, a sequência de nova linha é "\r\n". Isso significa que os.linesepserá "\r\n". Quando você está gravando em um arquivo no modo de texto, ele faz a conversão de nova linha à medida que escreve; isto é, cada um "\n"na saída será convertido "\r\n"no arquivo resultante. Você pode ver como isso é um problema se o texto que você está escrevendo já contiver "\r\n"seqüências: o resultado estará "\r\r\n"no final de cada linha. Eu suponho, pelo menos: eu realmente não tentei.
Nate CK
Talvez seja hora de corrigir a resposta e remover a os.linesepproposta errada , não? Não seria um grande drama e orgulho do autor não sofreria tanto Eu acredito
ZAB
8
Você não conhece meu orgulho. Mas, mais sério, acho útil notar que linesepexiste e existe para que você possa descobrir qual é o separador de linha do sistema.
Charlie Martin
2
@ZAB Nem todas as strings são gravadas em arquivos no modo de texto. linesepainda pode ser útil.
Kyle Strand
61

O novo caractere de linha é \n. É usado dentro de uma string.

Exemplo:

    print('First line \n Second line') 

onde \nestá o caractere de nova linha.

Isso produziria o resultado:

First line
 Second line

Se você usa o Python 2, não usa os parênteses na função de impressão.

python_powered
fonte
7
apenas como sugestão, se não dermos um 'espaço em branco' depois \ n, não obteremos um recuo de espaço na segunda linha. o que eu quis dizer é: print 'Primeira linha \ linha Nsecond'
Manoj Kumar
Obrigado por apontar para usar o caractere "\ n" escapado dentro de uma string! Talvez não seja óbvio para miúdos novos Python como eu
GrayedFox
3
@ all / qualquer pessoa / ManojKumar a = 1; b = 2; imprimir (a, "\ n", b); o / p: 1 2 (2 está na nova linha com um recuo de espaço em branco, não está aparecendo corretamente, mas assuma que 1 e 2 em linhas separadas com um recuo de espaço em branco em 2) Nesse caso, como removerei o espaço em branco (um recuo de espaço) antes de 2 e fará recuo com 1. Nota: não usaremos 2 instruções de impressão e 1 e 2 estarão em linhas (novas) separadas.
PRAFUL ANAND
24

Você pode escrever nas novas linhas separadamente ou em uma única sequência, o que é mais fácil.

Exemplo 1

Entrada

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

Você pode escrever o '\ n' separadamente:

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

Resultado

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

Exemplo 2

Entrada

Como outros já apontaram nas respostas anteriores, coloque \ n nos pontos relevantes da sua string:

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

file.write(line)

Resultado

hello how are you
I am testing the new line escape sequence
this seems to work
Homam Bahrani
fonte
Eu acho que sua saída é tecnicamente incorreta. A segunda e a terceira linha devem ser impressas com um espaço em branco à esquerda dos primeiros caracteres. Outra solução seria remover esses dois espaços da variável de linha.
Christian Westbrook
De qualquer forma, o código no exemplo dois não produziria a saída exata que você exibiu.
Christian Westbrook
10

Se você estiver inserindo várias linhas de texto ao mesmo tempo, acho que esse é o formato mais legível.

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

O \ no final de cada linha escapa à nova linha (o que causaria um erro).

fredcallaway
fonte
Seu parêntese interno, portanto, escapar linhas não é necessário. Apenas termine a string, vá para uma nova linha e inicie uma nova. Não haverá novas linhas adicionais e você não precisará escapar. Além disso, mesmo se você fez o acima, o novo caractere de linha e o escape simplesmente se cancelam.
user144153
9

No Python, você pode apenas usar o caractere de nova linha, ou seja, \n

mhawke
fonte
3
@maazza: não é a pergunta sobre escrever ?
Mckke # 9/15
9

Solução mais simples

Se você ligar apenas printsem argumentos, será exibida uma linha em branco.

print

Você pode canalizar a saída para um arquivo como este (considerando o seu exemplo):

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

Além de ser independente do sistema operacional (sem precisar usar o ospacote), também é mais legível do que colocar\n dentro de strings.

Explicação

A print()função possui um argumento opcional de palavra-chave para o final da string, chamado end, que assume como padrão o caractere de nova linha do SO, por exemplo. \n. Então, quando você está ligando print('hello'), o Python está realmente imprimindo 'hello' + '\n'. O que significa que quando você está ligando printsem argumentos, na verdade está imprimindo'' + '\n' , o que resulta em uma nova linha.

Alternativo

Use seqüências de várias linhas.

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

Disjuntor de linha independente de plataforma: Linux, windows e IOS

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

Resultado:

physical
distancing
Bandham Manikanta
fonte
4

Da mesma forma '\n', embora você provavelmente não precise do '\r'. Existe uma razão para você tê-lo em sua versão Java? Se você precisar / desejar, também poderá usá-lo da mesma maneira no Python.

Levon
fonte
1
\ré retorno de carro, quando você começa a propriedade do sistema para a nova linha aparece como\r\n
FabianCook
4
@ SmartLemon: Isso provavelmente é verdade no Windows, mas na maioria dos outros sistemas \né o único caractere de nova linha.
22712 Greg Hewgill
@ Jean-MichaëlCelerier: Isso era verdade antes do Mac OS X. O Mac OS X usa \n.
22813 Greg Hewgill
Ok, vou remover meu comentário, é realmente inútil então. Desculpe!
Jean-Michaël Celerier 31/07
4

\ n - a inserção simples de caracteres de nova linha 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
fonte
2

A maioria dos caracteres de escape em literais de string do Java também é válida no Python, como "\ r" e "\ n".

dolaameng
fonte
porque Python e Java foram influenciados por C e chegou a eles a partir dessa linguagem. Para mais informações .
Alex.K.
1

Como mencionado em outras respostas: "O novo caractere de linha é \ n. É usado dentro de uma string".

Achei que a maneira mais simples e legível é usar a função "format", usando nl como o nome da nova linha, e quebre a string que você deseja imprimir no formato exato em que irá imprimi-la:

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

Isso produzirá:

line1
line2
line3

Dessa forma, ele executa a tarefa e também oferece alta legibilidade ao código :)

Rea Haas
fonte
0

\ n separa as linhas de uma string. No exemplo a seguir, continuo escrevendo os registros em um loop. Cada registro é 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
fonte
0

Vale ressaltar que, quando você inspeciona uma string usando o shell python interativo ou um notebook Jupyter, as \noutras strings com barra invertida \tsão renderizadas 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!'

As novas linhas, guias e outros caracteres especiais não impressos são renderizados como espaço em branco somente quando impressos ou gravados em um arquivo:

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