¿Por qué csvwriter.writerow () pone una coma después de cada carácter?

97

Este código abre la URL y agrega el /namesal final y abre la página e imprime la cadena en 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)

Pero obtengo este resultado:

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

Si cambio la cadena a ("JD", "Columbia Law School" ...), obtengo

JD, Columbia Law School...)

No pude encontrar en la documentación cómo especificar el delimitador.

Si intento usar delimenter, obtengo este error:

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

Gracias por la ayuda.

Zeynel
fuente
8
Es delimitery no delimeter: docs.python.org/library/csv.html
John Paulett
Si tiene este problema con writer.writerow s , pásele una lista de listas y no una lista de cadenas.
Noumenon

Respuestas:

148

Espera una secuencia (por ejemplo: una lista o tupla) de cadenas. Le estás dando una sola cuerda. Una cadena también es una secuencia de cadenas, pero es una secuencia de cadenas de 1 carácter, que no es lo que quieres.

Si solo desea una cadena por fila, puede hacer algo como esto:

csvwriter.writerow([JD])

Esto envuelve JD (una cadena) con una lista.

Laurence Gonsalves
fuente
¡Gracias! Esto lo arregló. Intentaré otras respuestas también. También creé una lista vacía JDList = [] y agregué JD a eso, que también funciona, pero esto es más simple.
Zeynel
1
Ahora también escribe las comillas de la cadena. ¿Hay alguna manera de evitar eso?
CGFoX
@CGFoX ¿Puedes publicar un código de ejemplo que demuestre esto?
Laurence Gonsalves
writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])escribe la fecha y hora como"2016-11-05 20:30:19"
CGFoX
@CGFoX No puedo reproducir ese comportamiento. Me sale 2016-11-05 13:21:11sin comillas. ¿Qué versión de Python estás usando?
Laurence Gonsalves
5

La clase csv.writer toma un iterable como argumento para Writerow; Como las cadenas en Python son iterables por carácter, son un argumento aceptable para Writer ahora, pero obtienes el resultado anterior.

Para corregir esto, puede dividir el valor en función de los espacios en blanco (supongo que eso es lo que quiere)

csvwriter.writerow(JD.split())
Gabriel Reid
fuente
1

Esto sucede porque cuando el método group () de una instancia de MatchObject devuelve solo un valor, lo devuelve como una cadena. Cuando hay varios valores, se devuelven como una tupla de cadenas.

Si está escribiendo una fila, supongo, csv.writer itera sobre el objeto que le pasa. Si pasa una sola cadena (que es iterable), itera sobre sus caracteres, produciendo el resultado que está observando. Si pasa una tupla de cadenas, obtiene una cadena real, no un solo carácter en cada iteración.

shylent
fuente