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
, modifie et écrit les résultats dans thefile_subset1
.
Cependant, lorsque j'ouvre le fichier CSV résultant dans Microsoft Excel, il y a une ligne vierge supplémentaire après chaque enregistrement!
Existe-t-il un moyen de ne pas mettre une ligne vierge supplémentaire?
Réponses:
En Python 2, ouvrez
outfile
avec mode'wb'
au lieu de'w'
. Lescsv.writer
écrit\r\n
dans le fichier directement. Si vous n'ouvrez pas le fichier en mode binaire , il écrira\r\r\n
car sous Windows le mode texte se traduira chacun\n
en\r\n
.Dans Python 3, la syntaxe requise a changé (voir les liens de documentation ci-dessous), alors ouvrez-le
outfile
avec le paramètre supplémentairenewline=''
(chaîne vide) à la place.Exemples:
Liens de documentation
la source
io.open
avec l'newlines
argument. Si vous écrivez toujours en 2.x, cela semble de toute façon un meilleur choix car il est compatible avec le futur.io.open
. Il existe ununicodecsv
module tiers pour Python 2.7 qui fonctionne mieux.newline=''
astuce ne fonctionne pas en python3 avec StringIO ou TemporaryFile?StringIO
met en mémoire tampon les mêmes points de code qui seraient encodés dans un fichier etTemporaryFile
prend en charge lenewline
paramètre, afin qu'il puisse être ouvert comme avecopen
. Posez une question avec un exemple de programme qui ne fonctionne pas.L'ouverture du fichier en mode binaire "wb" ne fonctionnera pas dans Python 3+. Ou plutôt, vous devez convertir vos données en binaire avant de les écrire. C'est juste un problème.
Au lieu de cela, vous devez le conserver en mode texte, mais remplacer la nouvelle ligne comme vide. Ainsi:
la source
La réponse simple est que les fichiers csv doivent toujours être ouverts en mode binaire que ce soit pour l'entrée ou la sortie, car sinon sous Windows il y a des problèmes avec la fin de la ligne. Spécifiquement en sortie, le module csv écrira
\r\n
(le terminateur de ligne CSV standard) puis (en mode texte) le runtime remplacera le\n
par\r\n
(le terminateur de ligne standard Windows) donnant un résultat de\r\r\n
.Jouer avec le
lineterminator
n'est PAS la solution.la source
Remarque: Il semble que ce ne soit pas la solution préférée en raison de la façon dont la ligne supplémentaire a été ajoutée sur un système Windows. Comme indiqué dans le document python :
Windows est l'une de ces plateformes où cela fait une différence. Bien que la modification du terminateur de ligne comme je l'ai décrit ci-dessous puisse avoir résolu le problème, le problème pourrait être évité complètement en ouvrant le fichier en mode binaire. On pourrait dire que cette solution est plus "élégante". "Jouer" avec le terminateur de ligne aurait probablement entraîné un code non transférable entre les systèmes dans ce cas, où l'ouverture d'un fichier en mode binaire sur un système Unix n'a aucun effet. c'est à dire. il en résulte un code compatible entre les systèmes.
Depuis Python Docs :
Original :
Dans le cadre des paramètres facultatifs pour le csv.writer si vous obtenez des lignes vierges supplémentaires, vous devrez peut-être changer le lineterminator (info ici ). Exemple ci-dessous adapté des documents csv de la page python . Changez-le de '\ n' en ce qu'il devrait être. Comme ce n'est qu'un coup de couteau dans le noir, le problème peut ou non fonctionner, mais c'est ma meilleure estimation.
la source
J'écris cette réponse par écrit en python 3, car j'ai initialement rencontré le même problème.
J'étais censé obtenir des données d'Arduino en les utilisant
PySerial
et les écrire dans un fichier .csv. Chaque lecture dans mon cas se terminait par'\r\n'
, donc la nouvelle ligne séparait toujours chaque ligne.Dans mon cas, l'
newline=''
option n'a pas fonctionné. Parce qu'il a montré une erreur comme:Il semble donc qu'ils n'acceptent pas l'omission de la nouvelle ligne ici.
Ne voyant qu'une des réponses ici, j'ai mentionné le terminateur de ligne dans l'objet écrivain, comme,
writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')
et cela a fonctionné pour moi pour sauter les nouvelles lignes supplémentaires.
la source
with open('my_file.csv', 'a',newline='') as csvfile:
fonctionne très bien. Le problème avec votre réponse est qu'ici vous écrivez' '
au lieu de''
Le "lineterminator = '\ r'" permet de passer à la ligne suivante, sans ligne vide entre deux.
la source
Empruntant à cette réponse , il semble que la solution la plus propre soit à utiliser
io.TextIOWrapper
. J'ai réussi à résoudre ce problème par moi-même comme suit:La réponse ci-dessus n'est pas compatible avec Python 2. Pour avoir la compatibilité, je suppose qu'il faudrait simplement envelopper toute la logique d'écriture dans un
if
bloc:la source
Utilisez la méthode définie ci-dessous pour écrire des données dans le fichier CSV.
Ajoutez simplement un
newline=''
paramètre supplémentaire dans laopen
méthode:Cela va écrire des lignes CSV sans créer de lignes supplémentaires!
la source
Lors de l'utilisation de 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 donc aucune modification du kwarg de nouvelle ligne n'est nécessaire. Je rencontrais récemment le même problème et cela a fonctionné pour moi:
la source