2009-11-29 19 views
56

Este código abre la URL y añade el /names al final y abre la página e imprime la cadena a test1.csv:¿Por qué csvwriter.writerow() pone una coma después de cada carácter?

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 me da 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" ...) luego obtengo

JD, Columbia Law School...)

No pude encontrar en la documentación cómo especificar el delímetro.

Si intento utilizar delimenter consigo este error:

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

Gracias por la ayuda.

+8

Es '' delimiter' y no delimeter': http: //docs.python. org/library/csv.html –

Respuesta

90

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

Si lo que desea es una cadena por cada fila se podría hacer algo como esto:

csvwriter.writerow([JD]) 

Esto envuelve JD (una cadena) con una lista.

+0

¡Gracias! Esto lo solucionó. Voy a probar otras respuestas también. También creé una lista vacía JDList = [] y adjunté JD a eso, que también funciona pero es más simple. – Zeynel

+0

Sigue siendo útil :) – PhilipB

+1

Ahora también escribe las comillas de la cadena. ¿Hay alguna manera de evitar eso? – CGFoX

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 valores múltiples, se devuelven como una tupla de cadenas.

Si está escribiendo una línea, supongo que csv.writer repite 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, se obtiene una cadena real, no un solo carácter en cada iteración.

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 writerow, pero obtienes el resultado anterior.

Para corregir esto, se podía dividir el valor basado en el espacio en blanco (estoy asumiendo que es lo que quieres)

csvwriter.writerow(JD.split()) 
Cuestiones relacionadas