Comment spécifier de nouvelles lignes sur Python, lors de l'écriture sur des fichiers?

314

Par rapport à Java (dans une chaîne), vous feriez quelque chose comme "First Line\r\nSecond Line".

Alors, comment feriez-vous cela en Python, dans le but d'écrire plusieurs lignes dans un fichier normal?

FabianCook
la source
12
Qu'as-tu essayé? Cela a-t-il fonctionné? (Je suppose que non, ou vous ne demanderiez pas.) Que s'est-il passé?
Greg Hewgill
Je voulais juste savoir s'il y avait une bonne et une mauvaise façon de le faire, je ne l'avais pas encore essayé.
FabianCook
5
Vous vous rendez compte que Python printfonctionne comme System.out.printlnen Java et ajoute automatiquement une nouvelle ligne après le texte, non?
Greg Hewgill
Je le veux pour écrire des fichiers :)
FabianCook
2
L' printinstruction en Python peut également être utilisée pour écrire dans des fichiers (les détails diffèrent entre Python 2.x et Python 3.x, alors vérifiez avec les documents de référence pour votre version). printen Python 2.x - printen Python 3.x
Greg Hewgill

Réponses:

357

Cela dépend de la façon dont vous voulez être correct. \nfera généralement le travail. Si vous voulez vraiment bien faire les choses, vous recherchez le caractère de nouvelle ligne dans le ospackage . (Il s'appelle en fait linesep.)

Remarque: lors de l'écriture dans des fichiers à l'aide de l'API Python, n'utilisez pas le os.linesep. Utilisez simplement \n; Python traduit automatiquement cela en caractère de nouvelle ligne approprié pour votre plate-forme.

Charlie Martin
la source
14
À partir du lien que vous avez fourni "N'utilisez pas os.linesep comme terminateur de ligne lorsque vous écrivez des fichiers ouverts en mode texte (par défaut); utilisez un seul '\ n' à la place, sur toutes les plateformes." Alors, que voulez-vous dire par «droit» et quelles sont les raisons de leur et de votre commentaire?
Yasen
21
@Yasen: Sous Windows, la séquence de saut de ligne est "\r\n". Cela signifie que ce os.linesepsera "\r\n". Lorsque vous écrivez dans un fichier en mode texte, il effectue la traduction de nouvelle ligne au fur et à mesure de son écriture; c'est-à-dire que chacun "\n"dans la sortie sera traduit "\r\n"dans le fichier résultant. Vous pouvez voir comment c'est un problème si le texte que vous écrivez contient déjà des "\r\n"séquences: le résultat sera "\r\r\n"à la fin de chaque ligne. Je suppose, au moins: je ne l'ai pas vraiment essayé.
Nate CK
Il est peut-être temps de corriger la réponse déjà et de supprimer la mauvaise os.linesepproposition, non? Ce ne serait pas un grand drame et la fierté de l'auteur ne souffrirait pas beaucoup je crois
ZAB
8
Tu ne connais pas ma fierté. Mais plus sérieusement, je pense qu'il est utile de noter qu'il linesepexiste et qu'il existe afin que vous puissiez découvrir ce qu'est le séparateur de ligne système.
Charlie Martin
2
@ZAB Toutes les chaînes ne sont pas écrites dans des fichiers en mode texte. lineseppeut toujours être utile.
Kyle Strand
63

Le nouveau caractère de ligne est \n. Il est utilisé à l'intérieur d'une chaîne.

Exemple:

    print('First line \n Second line') 

\nest le caractère de nouvelle ligne.

Cela donnerait le résultat:

First line
 Second line

Si vous utilisez Python 2, vous n'utilisez pas les parenthèses sur la fonction d'impression.

python_powered
la source
7
juste comme suggestion, si nous ne donnons pas un "espace blanc" après \ n, nous n'obtenons pas un retrait d'espace en deuxième ligne. ce que je voulais dire, c'est: imprimer 'Première ligne \ nDeuxième ligne'
Manoj Kumar
Merci d'avoir indiqué d'utiliser le caractère "\ n" échappé à l'intérieur d'une chaîne! Peut-être pas évident pour les nouveaux enfants Python comme moi
GrayedFox
3
@ tout / n'importe qui / ManojKumar a = 1; b = 2; print (a, "\ n", b); o / p: 1 2 (2 est sur une nouvelle ligne avec un retrait d'espace blanc, il ne regarde pas correctement, mais supposez que 1 et 2 sur des lignes distinctes avec un retrait d'espace blanc sur 2) Dans ce cas, comment vais-je supprimer l'espace blanc (un indentation espace) avant 2 et indentera avec 1. Remarque: nous n'utiliserons pas 2 instruction d'impression et 1 et 2 seront sur des lignes (nouvelles) distinctes.
PRAFUL ANAND
24

Vous pouvez soit écrire dans les nouvelles lignes séparément ou dans une seule chaîne, ce qui est plus facile.

Exemple 1

Contribution

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

Vous pouvez écrire le '\ n' séparément:

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

Production

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

Exemple 2

Contribution

Comme d'autres l'ont souligné dans les réponses précédentes, placez le \ n aux points appropriés de votre chaîne:

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

file.write(line)

Production

hello how are you
I am testing the new line escape sequence
this seems to work
Homam Bahrani
la source
Je pense que votre sortie est techniquement incorrecte. La deuxième et la troisième ligne doivent imprimer avec un espace blanc à gauche de leurs premiers caractères. Une autre solution serait de supprimer ces deux espaces de la variable de ligne.
Christian Westbrook
En tout cas, le code de l'exemple deux ne produirait pas la sortie exacte que vous avez affichée.
Christian Westbrook
10

Si vous saisissez plusieurs lignes de texte à la fois, je trouve que c'est le format le plus lisible.

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

Le \ à la fin de chaque ligne échappe à la nouvelle ligne (ce qui provoquerait une erreur).

fredcallaway
la source
Votre parenthèse intérieure, donc les lignes d'échappement ne sont pas nécessaires. Il suffit de terminer la chaîne, de passer à une nouvelle ligne et d'en commencer une nouvelle. Il n'y aura pas de nouvelles lignes supplémentaires et vous n'aurez pas besoin de vous échapper. De plus, même si vous avez fait ce qui précède, le nouveau caractère de ligne et le caractère d'échappement s'annulent simplement.
user144153
9

En Python, vous pouvez simplement utiliser le caractère de nouvelle ligne, c'est-à-dire \n

mhawke
la source
3
@maazza: la question de l' écriture n'est-elle pas ?
mhawke
9

Solution la plus simple

Si vous appelez uniquement printsans argument, il affichera une ligne vierge.

print

Vous pouvez diriger la sortie vers un fichier comme celui-ci (en considérant votre exemple):

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

Non seulement il est indépendant du système d'exploitation (sans même avoir à utiliser le ospackage), il est également plus lisible que de mettre des \nchaînes.

Explication

La print()fonction a un argument de mot clé facultatif pour la fin de la chaîne, appelé end, qui par défaut est le caractère de nouvelle ligne du système d'exploitation, par exemple. \n. Ainsi, lorsque vous appelez print('hello'), Python imprime réellement 'hello' + '\n'. Ce qui signifie que lorsque vous appelez printsans aucun argument, c'est en fait l'impression '' + '\n', ce qui entraîne une nouvelle ligne.

Alternative

Utilisez des chaînes multilignes.

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

Disjoncteur indépendant de la plate-forme: Linux, Windows et IOS

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

Production:

physical
distancing
Bandham Manikanta
la source
4

De la même manière '\n', bien que vous n'en ayez probablement pas besoin '\r'. Y a-t-il une raison pour laquelle vous l'avez dans votre version Java? Si vous en avez besoin / le souhaitez, vous pouvez également l'utiliser de la même manière en Python.

Levon
la source
1
\rest le retour chariot, lorsque vous obtenez la propriété système pour la nouvelle ligne, elle apparaît comme\r\n
FabianCook
4
@SmartLemon: C'est probablement vrai sous Windows, mais sur la plupart des autres systèmes, \nc'est le seul caractère de nouvelle ligne.
Greg Hewgill
@ Jean-MichaëlCelerier: C'était vrai avant Mac OS X. Mac OS X utilise \n.
Greg Hewgill
Ok, je vais supprimer mon commentaire, c'est vraiment inutile alors. Désolé!
Jean-Michaël Celerier
4

\ n - l'insertion de caractères de nouvelle ligne simple fonctionne:

# 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
la source
2

La plupart des caractères d'échappement dans les littéraux de chaîne de Java sont également valides en Python, tels que "\ r" et "\ n".

dolaameng
la source
parce que Python et Java ont été influencés par C et cela leur est venu de ce langage. Pour en savoir plus .
Alex.K.
1

Comme mentionné dans d'autres réponses: "Le nouveau caractère de ligne est \ n. Il est utilisé à l'intérieur d'une chaîne".

J'ai trouvé que le moyen le plus simple et le plus lisible est d'utiliser la fonction "format", en utilisant nl comme nom pour la nouvelle ligne, et de casser la chaîne que vous souhaitez imprimer au format exact que vous allez imprimer:

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

Cela produira:

line1
line2
line3

De cette façon, il effectue la tâche et donne également une grande lisibilité du code :)

Rea Haas
la source
0

\ n sépare les lignes d'une chaîne. Dans l'exemple suivant, je continue d'écrire les enregistrements dans une boucle. Chaque enregistrement est séparé par \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
la source
0

Il convient de noter que lorsque vous inspectez une chaîne à l'aide du shell python interactif ou d'un bloc-notes Jupyter, la chaîne \net les autres chaînes avec barre oblique inverse \tsont rendues littéralement :

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

Les sauts de ligne, les tabulations et les autres caractères spéciaux non imprimés sont rendus en espaces blancs uniquement lorsqu'ils sont imprimés ou écrits dans un fichier:

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