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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top