web-dev-qa-db-fra.com

Gestion des nouvelles lignes\p\n\n en python sous Mac et Windows

J'ai un script python qui donne une sortie différente lorsqu'il est exécuté sur un ordinateur Windows et lorsqu'il est exécuté sur un Mac. En creusant plus profondément, j'ai découvert que c'était parce que, lorsque Python lisait les sauts de ligne sur le Mac (à partir d'un fichier), il lisait \r\n, alors que sous Windows le \r disparaissait.

Ainsi, si je change chaque \n du script en \r\n, cela fonctionne correctement sur Mac. Mais si je le fais, il ne fonctionne plus sur le PC Windows.

Existe-t-il un moyen facile de résoudre ce problème?

30
wrongusername

Je suppose que cela dépend de ce que vous lisez, mais la fonction open () intégrée prend un paramètre 'mode', et si vous passez 'U' pour le mode, Python prendra en charge les nouvelles lignes dans une croix. -plateforme de manière transparente. Cela nécessite que Python soit construit avec une prise en charge universelle newline, mais testez-le! 

http://docs.python.org/library/functions.html#open

22
jonesy

Différentes plates-formes ont des codes différents pour "nouvelle ligne". Windows a\r\n, Unix a\n, les anciens macs ont\r et oui, certains systèmes ont\n\r aussi.

Lorsque vous ouvrez un fichier en mode texte dans Python 3, toutes les nouvelles lignes sont converties en "\ n" et sont terminées.

infile = open("filename", 'r')

Le mode texte est le mode par défaut, donc si vous ne dites rien, c’est le mode texte. Mais il vaut toujours mieux être explicite:

infile = open("filename", 'rt')

Si vous ne voulez pas que la fin des lignes soit traduite, ouvrez le fichier en mode binaire:

infile = open("filename", 'rb')

En Python 2, c'est différent. Là, cette conversion ne se produirait que par défaut sous Windows . Si vous souhaitez que cela se produise sur d'autres plates-formes, vous pouvez ajouter l'indicateur de nouvelle ligne universel:

infile = open("filename", 'rU')

Cependant, vous dites que vous êtes sur Python 3, et que cela se passe en mode texte sur all plates-formes, donc l’ajout du drapeau U ne devrait faire aucune différence.

35
Lennart Regebro

Dans Python 3, utilisez le mot clé argument "newline = '\ n'" dans open () pour utiliser un délimiteur de ligne spécifié lors de l'écriture de fichiers texte. Pour plus d'informations, s'il vous plaît voir:

https://pythonconquerstheuniverse.wordpress.com/2011/05/08/newline-conversion-in-python-3/

http://docs.python.org/3/library/functions.html#open

6
Felix

Sous Windows, les deux fonctionnent correctement si j'essaie d'écrire un fichier avec l'un des deux (\ r ou\n) python l'interprète comme un saut de ligne dans les deux cas. En utilisant "\ r\n", il est interprété comme un saut de ligne double (Python 3 sous Windows).

0
as g

En Python 3, la méthode Open() a un paramètre newline :

newline contrôle le fonctionnement du mode de nouvelle ligne universel (il s’applique uniquement au mode texte ). Ce peut être Aucun, '', '\ n', '\ r' et '\ r\n'. Cela fonctionne comme suit:

Lors de la lecture des entrées du flux, si newline est None, universal le mode de nouvelle ligne est activé. Les lignes de l'entrée peuvent se terminer par '\ n', '\ r' ou '\ r\n', et ceux-ci sont traduits en '\ n' avant d'être renvoyés à l'appelant. S'il est '', le mode de nouvelle ligne universel est activé, mais en mode ligne les terminaisons sont renvoyées à l'appelant sans traduction. Si il a l'un des autres valeurs légales, les lignes d’entrée ne sont terminées que par la donnée chaîne, et la fin de ligne est renvoyée à l'appelant sans traduction.

Lors de l'écriture de la sortie dans le flux, si newline est None, tout '\ n' les caractères écrits sont traduits dans la ligne par défaut du système séparateur, os.linesep. Si newline est '' ou '\ n', aucune traduction ne prend endroit. Si newline est l’une des autres valeurs légales, n’importe lequel '\ n' les caractères écrits sont traduits dans la chaîne donnée.

L'ancienne façon d'utiliser le spécificateur de mode U a été déconseillée en faveur de cette nouvelle façon.

Mode de nouvelles lignes universelles 'U' (obsolète)

0
jdhao