709 votes

python: se débarrasser de la ligne supplémentaire:

 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 , apporte des modifications et écrit les résultats dans thefile_subset1 .

Lorsque j'ouvre le csv résultant dans Microsoft Excel, il devrait y avoir une ligne supplémentaire après chaque enregistrement!

Y a-t-il un moyen de ne pas mettre une ligne vierge supplémentaire?

1389voto

Mark Tolonen Points 32702

En Python 2, ouvrez outfile mode 'wb' au lieu de 'w'. L' csv.writer écrit \r\n dans le fichier directement. Si vous n'ouvrez pas le fichier en binaire , il va écrire \r\r\n parce que sous Windows, texte mode traduire chaque \n en \r\n.

En Python 3 la syntaxe requise 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)

Des Liens Vers La Documentation

89voto

user673803 Points 37

L’ouverture du fichier en mode binaire "wb" ne fonctionnera pas en Python 3+. Ou plutôt, vous devrez convertir vos données en binaire avant de les écrire. C'est juste un problème.

Au lieu de cela, vous devriez le garder en mode texte, mais remplacer la nouvelle ligne par vide. Ainsi:

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

15voto

Derek Litz Points 3074

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 fichier, il doit être ouvert avec le ‘b' sur les plates-formes où cela fait une différence.

Windows est une telle plate-forme où cela fait une différence. Lors du changement de la terminaison de ligne comme je l'ai décrit ci-dessous peuvent avoir résolu le problème, le problème pourrait être évité complètement par l'ouverture du 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. c'est à dire. il en résulte dans le système de la croix du code compatible.

À Partir De Python Docs:

Sur Windows, " b " annexé à la mode ouvre le fichier en mode binaire, de sorte il y a aussi des modes de transport comme le 'rb', 'wb', et "r+b". Python sur Windows fait une distinction entre le texte et binaire fichiers; la fin-de-ligne de caractères dans les fichiers texte sont automatiquement modifiés légèrement lorsque des données sont lues ou écrites. Cette derrière-le-scènes de la modification de fichier de données est bien pour le texte ASCII fichiers, mais il va corrompre des données binaires comme ça en JPEG ou de fichiers EXE. Être très attention à utiliser le mode binaire lors de l' la lecture et l'écriture de ces fichiers. Sur Unix, il ne fait pas de mal à ajouter un "b" à la mode, donc vous pouvez l'utiliser la plate-forme indépendante pour tous les binaires les fichiers.

Origine:

Dans le cadre de l'option paramètres pour le csv.écrivain si vous obtenez des lignes vierges supplémentaires que vous pourriez avoir à changer le lineterminator (info ici). L'exemple ci-dessous adaptés à partir de l'python page csv docs. Changer de '\n' à ce qu'il devrait être. Comme c'est juste un coup de poignard dans le noir, à la le problème que cela peut ou peut ne pas fonctionner, mais c'est ma meilleure supposition.

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

12voto

John Machin Points 39706

La réponse simple est que les fichiers csv doit toujours être ouvert en mode binaire que ce soit pour l'entrée ou la sortie, sinon sur Windows il y a des problèmes avec les caractères de fin de ligne. Plus précisément sur la sortie du module csv écrira \r\n (la norme CSV marque de fin de ligne), puis (en mode texte) le moteur d'exécution de remplacer l' \n par \r\n (le standard de Windows terminateur de ligne) donnant un résultat d' \r\r\n.

Jongler avec l' lineterminator n'est PAS la solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X