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

97

Ce code ouvre l'url et ajoute le /namesà la fin et ouvre la page et imprime la chaîne à 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 pu trouver dans la documentation comment spécifier le délimiteur.

Si j'essaie d'utiliser, delimenterj'obtiens cette erreur:

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

Merci pour l'aide.

Zeynel
la source
8
C'est delimiteret pas delimeter: docs.python.org/library/csv.html
John Paulett
Si vous rencontrez ce problème avec writer.writerow s , transmettez-lui une liste de listes et non une liste de chaînes.
Noumenon le

Réponses:

148

Il attend une séquence (par exemple: une liste ou un tuple) de chaînes. Vous lui donnez une seule corde. Une chaîne est également une séquence de chaînes, mais c'est une séquence de chaînes de 1 caractère, 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 encapsule JD (une chaîne) avec une liste.

Laurence Gonsalves
la source
Merci! Cela l'a corrigé. J'essaierai aussi d'autres réponses. J'ai également créé une liste vide JDList = [] et ajouté JD à cela, cela fonctionne aussi mais c'est plus simple.
Zeynel
1
Maintenant, il écrit également les guillemets de la chaîne. Y a-t-il un moyen de contourner cela?
CGFoX
@CGFoX Pouvez-vous publier un exemple de code qui illustre cela?
Laurence Gonsalves
writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])écrit le datetime comme"2016-11-05 20:30:19"
CGFoX
@CGFoX Je ne peux pas reproduire ce comportement. Je reçois 2016-11-05 13:21:11sans devis. Quelle version de Python utilisez-vous?
Laurence Gonsalves
5

La classe csv.writer prend un itérable comme argument de 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 pouvez diviser la valeur en fonction des espaces (je suppose que c'est ce que vous voulez)

csvwriter.writerow(JD.split())
Gabriel Reid
la source
1

Cela se produit, car lorsque la méthode group () d'une instance 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, csv.writer itère sur 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.

timide
la source