2009-07-23 4 views
36

Selon le its documentation csv.writer doit utiliser '\ r \ n' comme lineterminator par défaut.Un auteur CSV Python 2 produit un mauvais terminateur de ligne sous Windows

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

Imprime

\r\n 
\r\n 

comme prévu. Mais, le fichier csv créé utilise le lineterminator \ 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 est-il quelque chose de mal dans mon utilisation de csv.writer?

Python version:

ActivePython 2.6.2.2 (ActiveState Software Inc. ) basé sur Python 2.6.2 (R262: 71600 21 Avr 2009, 15:05:37) [MSC v 0,1500 32 bits (Intel)] sur win32

sur Windows Vista

+0

Je ne peux pas reproduire votre problème: $ fichier test.csv test.csv: texte ASCII, avec des terminaisons de ligne CRLF –

+1

@lutz: $ prompt signifie * x ce qui signifie aucune différence (en Python 2.x) entre le texte mode et mode binaire; OP fonctionne sous Windows. –

+2

@wierob: perdez le .replace (...). Replace (...), utilisez le repr ( –

Répondre

60

en Python 2.x, toujours ouvrir votre fichier dans le mode binaire , tel que documenté . csv écrit \r\n comme prévu, mais les sous-jacents des coupes de mécanisme de fichier texte de Windows dans et les changements qui \n-\r\n ... effet total: \r\r\n

De la documentation csv.writer:

Si csvfile est un objet fichier, il doit être ouvert avec le drapeau 'b' sur les plates-formes où cela fait une différence.

Il semble y avoir une certaine réticence à proférer en fait le nom du coupable principal :-)

+0

semble fonctionner. Pouvez-vous me dire où cela est documenté? – wierob

+6

Une belle "fonctionnalité" est qu'on peut toujours ouvrir en mode binaire sur des plates-formes où cela n'a pas d'importance - par exemple, Linux, donc utilisez toujours le mode binaire. – Arafangion

+2

À partir du 3.6, les docs disent maintenant 'Si csvfile est un objet fichier, il doit être ouvert avec newline = ''' – jebob

15

Malheureusement, il est un peu différent avec le module csv pour Python 3, mais ce code fonctionnera à la fois Python 2 et Python 3:

if sys.version_info >= (3,0,0): 
    f = open(filename, 'w', newline='') 
else: 
    f = open(filename, 'wb') 
+0

Je crois que c'est La seule solution qui fonctionne à la fois sur Python 2 et 3, Windows et Linux, et qui génère des fichiers conformes à la norme CSV de '\ r \ n', quelle que soit la plate-forme. – MestreLion

19

Pour modifier la terminaison de ligne utilisé écrivain Python 2.7 csv

writer = csv.writer(f, delimiter = '|', lineterminator='\n')

Ceci est un moyen beaucoup plus simple de changer le délimiteur par défaut de \ r \ n.

+0

Cela fonctionne pour moi dans 3.4 ainsi – Terrabits

+0

Cela fonctionne et est simple !! J'utilise DictWriter pour stdout --- donc les solutions ci-dessus ne sont pas vraiment appropriées ou ajoutent des frais supplémentaires. – ripvlan

+0

Connexe: https://stackoverflow.com/a/39379062/95852 –

Questions connexes