Pourquoi le fichier CSV contient-il une ligne blanche entre chaque ligne de données lors de la sortie avec Dictwriter en Python [dupliquer]

cette question a déjà une réponse ici:

J'utilise DictWriter pour sortir des données dans un dictionnaire vers un fichier csv. Pourquoi le fichier CSV ont une ligne vide entre chaque ligne de données? Ce n'est pas un énorme affaire, mais mon ensemble de données est grand et ne rentre pas dans un fichier csv parce qu'il a trop de lignes depuis le "double espacement" double le nombre de lignes dans le fichier.

mon code pour écrire au dictionnaire est:

headers=['id', 'year', 'activity', 'lineitem', 'datum']
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
output.writerow(dict((fn,fn) for fn in headers))
for row in rows:
    output.writerow(row)
80
demandé sur myname 2012-01-05 21:31:27

4 réponses

par défaut, les classes du module csv utilisent des terminateurs de ligne de style Windows ( \r\n ) plutôt que le style Unix ( \n ). Est-ce que c'est ce qui a causé la rupture de la ligne double?

si c'est le cas, vous pouvez l'Annuler dans le DictWriter constructeur:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)
102
répondu FatBusinessman 2012-01-05 17:44:21

de http://docs.python.org/library/csv.html#csv.writer :

Si csvfile est un objet fichier, il doit être ouvert avec le ‘b’ sur les plateformes où cela fait une différence.

en d'autres termes, en ouvrant le fichier, vous passez " wb "par opposition à "w".

Vous pouvez également utiliser un with déclaration de fermer le fichier lorsque vous avez terminé l'écriture.

Exemple éprouvé ci-dessous:

from __future__ import with_statement # not necessary in newer versions
import csv
headers=['id', 'year', 'activity', 'lineitem', 'datum']
with open('file3.csv','wb') as fou: # note: 'wb' instead of 'w'
    output = csv.DictWriter(fou,delimiter=',',fieldnames=headers)
    output.writerow(dict((fn,fn) for fn in headers))
    output.writerows(rows)
30
répondu bernie 2012-01-05 17:54:45

modifier le 'w' (écrire) dans cette ligne:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)

'wb' (écriture binaire) a résolu ce problème pour moi:

output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers)

Python v2.75: Open ()

crédit à @dandrejvv pour la solution dans le commentaire sur le post original ci-dessus.

10
répondu James Nicholson 2013-09-04 21:28:04

je viens de tester votre snippet, et il n'y a pas de double interligne ici. La fin de ligne sont \r\n , donc ce que je vérifierais dans votre cas est:

  1. votre éditeur lit correctement le fichier DOS
  2. no \n existent dans les valeurs de vos lignes dict.

(notez que même en mettant une valeur avec \n, DictWriter cite automatiquement la valeur.)

0
répondu tito 2012-01-05 17:42:35