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)
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)
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)
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)
Merci à @dandrejvv pour la solution proposée dans le commentaire du message original ci-dessus.
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:
(Notez que même en mettant une valeur avec\n, DictWriter cite automatiquement la valeur.)