web-dev-qa-db-fra.com

Pourquoi le fichier CSV contient-il une ligne vierge entre chaque ligne de données lors de la sortie avec Dictwriter dans Python

J'utilise DictWriter pour exporter les données d'un dictionnaire dans un fichier CSV. Pourquoi le fichier CSV comporte-t-il une ligne vierge entre chaque ligne de données? Ce n'est pas un gros problème, mais mon jeu de données est volumineux et ne rentre pas dans un seul fichier csv car il contient trop de lignes car le "double espacement" double le nombre de lignes du fichier.

Mon code pour écrire dans le 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)
87
myname

Par défaut, les classes du module csv utilisent des terminaisons de ligne de style Windows (\r\n) plutôt que de style Unix (\n). Serait-ce la cause des apparents doubles sauts de ligne?

Si tel est le cas, vous pouvez le remplacer dans le constructeur DictWriter:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)
120
FatBusinessman

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

Si csvfile est un objet de fichier, vous devez l’ouvrir avec le drapeau "b" sur les plates-formes où cela fait une différence.

En d'autres termes, lorsque vous ouvrez le fichier, vous passez "wb" par opposition à "w".
Vous pouvez également utiliser une instruction with pour fermer le fichier lorsque vous avez fini de l'écrire.
Exemple testé 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
bernie

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

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

Pour 'wb' (écrire en binaire) corrigé ce problème pour moi:

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

Python v2.75: Open ()

Merci à @dandrejvv pour la solution proposée dans le commentaire du message original ci-dessus.

10
James Nicholson

Je viens de tester votre extrait, et il n’ya pas de ligne à double interligne ici. La fin de ligne est \r\n, donc ce que je voudrais vérifier dans votre cas est:

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

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

0
tito