import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()
Il génère un fichier, test.csv
avec un extra \r
à chaque ligne, comme ceci:
test.csv
hi,dude\r\r\nhi2,dude2\r\r\n
au lieu de l'attendu:
hi,dude\r\nhi2,dude2\r\n
Pourquoi cela se produit-il ou est-ce réellement le comportement souhaité?
Remarque:
- Ce problème peut se produire avec Python 2 ou 3.
Réponses:
Python 3:
newline=''
newline='\n'
Python 2:
Sous Windows, ouvrez toujours vos fichiers en mode binaire (
"rb"
ou"wb"
), avant de les passer àcsv.reader
oucsv.writer
.Bien que le fichier soit un fichier texte, CSV est considéré comme un format binaire par les bibliothèques concernées, avec
\r\n
des enregistrements séparés. Si ce séparateur est écrit en mode texte, le runtime Python remplace le\n
par\r\n
, d'où l'\r\r\n
observé dans le fichier.Voir cette réponse précédente .
la source
open(..., "w", newline="\n", encoding="utf-8")
.newline
peut également être une chaîne vide, même résultat."wb"
ne fonctionne pas dans Python 3, les chaînes et l'interface de tampon sont incompatibles.writer = csv.writer(f, lineterminator='\n')
Bien que @ john-machin donne une bonne réponse, ce n'est pas toujours la meilleure approche. Par exemple, cela ne fonctionne pas sur Python 3 à moins que vous n'encodiez toutes vos entrées dans le rédacteur CSV. En outre, il ne résout pas le problème si le script souhaite utiliser sys.stdout comme flux.
Je suggère plutôt de définir l'attribut 'lineterminator' lors de la création de l'écrivain:
Cet exemple fonctionnera sur Python 2 et Python 3 et ne produira pas les caractères de nouvelle ligne indésirables. Notez, cependant, qu'il peut produire des sauts de ligne indésirables (en omettant le caractère LF sur les systèmes d'exploitation Unix).
Dans la plupart des cas, cependant, je pense que le comportement est préférable et plus naturel que de traiter tous les CSV comme un format binaire. Je fournis cette réponse comme une alternative pour votre considération.
la source
\r
ne s'échappe plus! Il semble que ce soit un bugcsvwriter
, mais en l'état, la sortie de CSV non conforme signifie que ce n'est pas la voie à suivre.^M
problème pour moi alors que les 2 suggestions de la réponse acceptée n'ont pas fonctionné.En Python 3 (je n'ai pas essayé cela en Python 2), vous pouvez aussi simplement faire
selon la documentation .
Plus à ce sujet dans la note de bas de page du doc :
la source
Vous pouvez introduire le paramètre lineterminator = '\ n' dans la commande csv writer.
la source
lineterminator='\n'
); le module CSV semblait être à l'origine de\r\n
. Aucun ensemble d'argumentsopen
n'a eu d'effet.Je ne sais pas exactement pourquoi cela se produit, mais changer votre mode de fichier de "w" à "wb" le corrige. Voir ma réponse à " comment supprimer ^ M " pour plus de détails.
la source
Vous devez ajouter l'attribut newline = "\ n" pour ouvrir une fonction comme celle-ci:
la source
Notez que si vous utilisez DictWriter, vous aurez une nouvelle ligne de la fonction open et une nouvelle ligne de la fonction writerow. Vous pouvez utiliser newline = '' dans la fonction ouverte pour supprimer la nouvelle ligne supplémentaire.
la source