127 votes

Pourquoi csvwriter.writerow() met-il une virgule après chaque caractère ?

Ce code ouvre l'URL et ajoute l'élément /names à la fin, ouvre la page et imprime la chaîne à l'adresse test1.csv :

import urllib2
import re
import csv

url = ("http://www.example.com")
bios = [u'/name1', u'/name2', u'/name3']
csvwriter = csv.writer(open("/test1.csv", "a"))

for l in bios:
    OpenThisLink = url + l
    response = urllib2.urlopen(OpenThisLink)
    html = response.read()
    item = re.search('(JD)(.*?)(\d+)', html)
    if item:
        JD = item.group()
        csvwriter.writerow(JD)
    else:
        NoJD = "NoJD"
        csvwriter.writerow(NoJD)

Mais j'obtiens ce résultat :

J,D,",", ,C,o,l,u,m,b,i,a, ,L,a,w, ,S,c,h,o,o,l,....

Si je remplace la chaîne par ("JD", "Columbia Law School" ....), j'obtiens alors

JD, Columbia Law School...)

Je n'ai pas trouvé dans la documentation comment spécifier le délimiteur.

Si j'essaie d'utiliser delimeter J'obtiens cette erreur :

TypeError: 'delimeter' is an invalid keyword argument for this function

190voto

Laurence Gonsalves Points 50783

Il attend une séquence (par exemple, une liste ou un tuple) de chaînes de caractères. Vous lui donnez une seule chaîne. Il se trouve qu'une chaîne est aussi une séquence de chaînes, mais c'est une séquence de chaînes à 1 caractère, ce qui n'est pas ce que vous voulez.

Si vous ne voulez qu'une chaîne par ligne, vous pouvez faire quelque chose comme ceci :

csvwriter.writerow([JD])

JD (une chaîne) est ainsi enveloppé dans une liste.

13voto

Gabriel Reid Points 1598

La classe csv.writer prend un itérable comme argument pour writerow ; comme les chaînes en Python sont itérables par caractère, elles sont un argument acceptable pour writerow, mais vous obtenez la sortie ci-dessus.

Pour corriger cela, vous pourriez diviser la valeur en fonction des espaces blancs (je suppose que c'est ce que vous voulez)

csvwriter.writerow(JD.split())

3voto

shylent Points 4590

En effet, lorsque la méthode group() d'une instance de MatchObject ne renvoie qu'une seule valeur, elle la renvoie sous la forme d'une chaîne de caractères. Lorsqu'il y a plusieurs valeurs, elles sont renvoyées sous la forme d'un tuple de chaînes de caractères.

Si vous écrivez une ligne, je suppose que csv.writer itère sur l'objet que vous lui passez. Si vous lui passez une simple chaîne de caractères (qui est un itérable), il itère sur ses caractères, produisant le résultat que vous observez. Si vous lui passez un tuple de chaînes, il obtient une chaîne réelle, et non un seul caractère à chaque itération.

1voto

Dyonn Points 1

En d'autres termes, si vous ajoutez des crochets autour de l'ensemble de la sortie, celle-ci sera traitée comme un seul élément, et les virgules ne seront donc pas ajoutées. par exemple, au lieu de :

spamwriter.writerow(matrix[row]['id'],matrix[row]['value'])

utiliser :

spamwriter.writerow([matrix[row]['id'] + ',' + matrix[row]['value']])

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