L'écrivain Python 2 CSV produit un mauvais terminateur de ligne sur Windows
-
19-09-2019 - |
Question
Selon le sa documentation CSV.Writer doit utiliser ' r n' comme lineTerminator par défaut.
import csv
with open("test.csv", "w") as f:
writer = csv.writer(f)
rows = [(0,1,2,3,4),
(-0,-1,-2,-3,-4),
("a","b","c","d","e"),
("A","B","C","D","E")]
print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
writer.writerows(rows)
print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
Cela imprime
\r\n
\r\n
comme prévu. Mais, le File CSV créé utilise le linéterminateur ' r r n'
0,1,2,3,4
0,-1,-2,-3,-4
a,b,c,d,e
A,B,C,D,E
Est-ce un bug ou y a-t-il quelque chose qui ne va pas dans mon utilisation de CSV.Writer?
Version Python:
ActivePython 2.6.2.2 (ActiveState Software Inc.) basé sur Python 2.6.2 (R262: 71600, 21 avril 2009, 15:05:37) [MSC V.1500 32 bits (Intel)] sur Win32
sur Windows Vista
La solution
Dans Python 2.x, ouvrez toujours votre fichier dans binaire Mode, comme documenté. csv
écrit \r\n
Comme vous vous y attendez, mais le mécanisme de fichier texte sous-jacent réduit et modifie que \n
à \r\n
... Effet total: \r\r\n
Du csv.writer
Documentation:
Si csvfile est un objet de fichier, il doit être ouvert avec le
'b'
Flag sur les plates-formes où cela fait une différence.
Il semble y avoir des réticences à propos de prononcer le nom du coupable principal :-)
Edit: comme mentionné par @JeBOB dans les commentaires de cette réponse et basé sur @dave burton réponse, Pour gérer ce cas dans Python 2 et 3, vous devez effectuer ce qui suit:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
Autres conseils
Malheureusement, c'est un peu différent avec le module CSV pour Python 3, mais ce code fonctionnera sur Python 2 et Python 3:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
Pour changer le terminateur de ligne dans Python 2.7 CSV Écrivain Utiliser
writer = csv.writer(f, delimiter = '|', lineterminator='\n')
Il s'agit d'un moyen beaucoup plus simple de modifier le délimiteur par défaut de r n.