Le fichier CSV écrit avec Python a des lignes vides entre chaque ligne

import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))
  import collections
  counter = collections.defaultdict(int)

  for row in data:
        counter[row[10]] += 1


with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for row in data:
        if counter[row[10]] >= 504:
           writer.writerow(row)

ce code lit thefile.csv , fait des changements, et écrit des résultats à thefile_subset1 .

cependant, quand j'ouvre le csv résultant dans Microsoft Excel, il y a une ligne vide supplémentaire après chaque enregistrement!

y a-t-il un moyen de ne pas rajouter une ligne vide?

241
demandé sur davidism 2010-07-28 02:14:42

6 réponses

en Python 2, Ouvrez outfile avec le mode 'wb' au lieu de 'w' . Le csv.writer écrit \r\n directement dans le fichier. Si vous n'ouvrez pas le fichier en mode binaire , il écrira \r\r\n car sur Windows mode texte traduira chaque \n en \r\n .

en Python 3 la syntaxe requise a changé, donc ouvrez outfile avec le paramètre supplémentaire newline='' à la place.

exemples:

# Python 2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
    writer = csv.writer(outfile)

# Python 3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

Liens De Documentation

484
répondu Mark Tolonen 2014-07-14 15:48:51

ouvrir le fichier en mode binaire "wb" ne fonctionnera pas en Python 3+. Ou plutôt, vous devez convertir vos données en binaire avant de l'écrire. C'est juste une dispute.

à la place, vous devriez le garder en mode texte, mais annuler la ligne comme vide. Comme ceci:

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
33
répondu David Maddox 2014-04-19 21:34:58

la réponse simple est que fichiers csv doivent toujours être ouverts en mode binaire que ce soit pour l'entrée ou la sortie, car sinon sur Windows, il ya des problèmes avec la fin de la ligne. Spécifiquement sur la sortie le module csv écrira \r\n (le terminateur de ligne CSV standard) et puis (en mode texte) l'exécution remplacera le \n par \r\n (le terminateur de ligne standard de Windows) donnant un résultat de \r\r\n .

jouer avec le lineterminator n'est pas la solution.

11
répondu John Machin 2010-07-27 23:14:42

Remarque: Il semble que ce n'est pas la meilleure solution, car de la façon dont la ligne supplémentaire a été ajouté sur un système windows. Comme indiqué dans le python documement :

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

Windows est l'une de ces plateformes où cela fait une différence. En changeant le terminator de ligne comme je l'ai décrit ci-dessous peut avoir corrigé le problème, le problème pourrait être évité tout à fait en ouvrant le fichier en mode binaire. On pourrait dire que cette solution est plus "elegent". "Tripoter" avec le terminateur de ligne aurait probablement entraîné portables code entre les systèmes dans ce cas, où l'ouverture d'un fichier en mode binaire sur un système unix n'entraîne aucun effet. IE. il en résulte un code compatible avec tous les systèmes.

From Python Docs :

sur Windows, " b " ajouté au mode ouvre le fichier en mode binaire, de sorte il y a aussi des modes comme "rb", "wb", et "r+b". Python sur Windows fait un distinction entre texte et binaire fichiers; les caractères de fin de ligne dans les fichiers texte sont automatiquement modifiés légèrement lorsque des données sont lues ou écrites. Cette modification des coulisses les données de fichier sont très bien pour le texte ASCII des fichiers, mais ça corrompt les données binaires. comme ça dans les fichiers JPEG ou EXE. Être très prudent d'utilisation le mode binaire lors de l' lire et écrire de tels fichiers. Sur Unix, ça ne fait pas de mal d'ajouter un "b" au mode, pour que tu puisses l'utiliser plate-forme-indépendamment pour tous les binaires fichier.

Original :

faisant partie des paramaters optionnels pour le csv.Ecrivain si vous recevez des lignes vierges supplémentaires, vous pourriez avoir à changer le déterminant (info ici ). Exemple ci-dessous adapté de la page python csv docs. Changer de '\n' à ce qu'il devrait être. Comme c'est juste un coup dans l'obscurité au problème que cela peut ou ne peut pas fonctionner, mais c'est ma meilleure estimation.

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
6
répondu Derek Litz 2010-07-28 04:22:07

j'écris cette réponse W. R. T. à python 3, comme j'ai d'abord eu le même problème.

j'étais supposé obtenir des données d'arduino en utilisant PySerial , et les écrire dans un .fichier csv. Chaque lecture dans mon cas se terminait par '\r\n' , donc newline séparait toujours chaque ligne.

dans mon cas, newline='' option n'a pas fonctionné. Parce qu'il a montré une erreur comme:

with open('op.csv', 'a',newline=' ') as csv_file:

ValueError: illegal newline value: ''

donc il semble qu'ils n'acceptent pas omission de newline ici.

en voyant l'une des réponses ici seulement, j'ai mentionné le terminateur de ligne dans l'objet de l'écrivain, comme,

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')

et ça a marché pour moi pour sauter les nouvelles supplémentaires.

2
répondu Debanjan Dey 2017-11-03 19:51:09

en utilisant Python 3, les lignes vides peuvent être évitées en utilisant le module codecs . Comme indiqué dans la documentation, les fichiers sont ouverts en mode binaire de sorte qu'aucun changement de newline kwarg n'est nécessaire. J'ai rencontré le même problème récemment et cela a fonctionné pour moi:

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)
0
répondu JBa 2018-08-24 11:30:43