web-dev-qa-db-fra.com

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

Ce code ouvre l'url et ajoute le /names à la fin et ouvre la page et imprime la chaîne dans 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 change la chaîne en ("JD", "Columbia Law School" ....) alors j'obtiens

JD, Columbia Law School...)

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

Si j'essaie d'utiliser delimenter j'obtiens cette erreur:

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

Merci pour l'aide.

78
Zeynel

Il attend une séquence (par exemple: une liste ou un Tuple) de chaînes. Vous lui donnez une seule chaîne. Une chaîne se trouve être également une séquence de chaînes, mais c'est une séquence de 1 chaîne de caractères, ce qui n'est pas ce que vous voulez.

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

csvwriter.writerow([JD])

Cela enveloppe JD (une chaîne) avec une liste.

114
Laurence Gonsalves

La classe csv.writer prend un itérable comme argument pour writerow; comme les chaînes de caractères 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 pouvez diviser la valeur en fonction de l'espace (je suppose que c'est ce que vous voulez)

csvwriter.writerow(JD.split())
5
Gabriel Reid

Cela se produit, car lorsque la méthode group () d'une occurrence de MatchObject ne renvoie qu'une seule valeur, elle la renvoie sous forme de chaîne. Lorsqu'il existe plusieurs valeurs, elles sont renvoyées sous la forme d'un tuple de chaînes.

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

1
shylent