2009-11-29 25 views
56

Questo codice apre l'url e aggiunge il /names alla fine e si apre la pagina e stampa la stringa da test1.csv:Perché csvwriter.writerow() inserisce una virgola dopo ogni carattere?

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) 

ma ottengo questo risultato:

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

Se cambio la stringa a ("JD", "Columbia Law School" ....) poi ottengo

JD, Columbia Law School...)

Non ho trovato nella documentazione come specificare il delimitatore.

Se provo ad usare delimenter ottengo questo errore:

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

Grazie per l'aiuto.

+8

E ' 'delimiter' e non' delimeter': http: //docs.python. org/library/csv.html –

risposta

90

Si aspetta una sequenza (ad esempio: una lista o una tupla) di stringhe. Lo stai dando una singola stringa. Una stringa sembra essere una sequenza di stringhe, ma è una sequenza di stringhe di 1 carattere, che non è quello che vuoi.

Se si desidera solo una corda per riga si potrebbe fare qualcosa di simile:

csvwriter.writerow([JD]) 

Questo avvolge JD (una stringa) con una lista.

+0

Grazie! Questo l'ha risolto. Proverò anche altre risposte. Ho anche creato una lista vuota JDList = [] e aggiunta JD a quello, che funziona anche ma questo è più semplice. – Zeynel

+0

Ancora utile :) – PhilipB

+1

Ora scrive anche le virgolette della stringa. C'è un modo per aggirare questo? – CGFoX

1

Questo succede, perché quando il metodo group() di un'istanza MatchObject restituisce solo un singolo valore, lo restituisce come una stringa. Quando ci sono più valori, vengono restituiti come una tupla di stringhe.

Se si sta scrivendo una riga, suppongo che csv.writer esegua l'iterazione dell'oggetto che si passa ad esso. Se passi una singola stringa (che è un iterabile), itera sui suoi personaggi, producendo il risultato che stai osservando. Se passi una tupla di stringhe, ottiene una stringa vera e propria, non un singolo carattere in ogni iterazione.

5

La classe csv.writer accetta un iterable come argomento per authorowow; siccome le stringhe in Python sono iterabili per carattere, sono un argomento accettabile per scrivere, ma ottieni l'output sopra.

Per correggere questo, si potrebbe dividere il valore in base a spazi bianchi (sto supponendo che è quello che vuoi)

csvwriter.writerow(JD.split()) 
Problemi correlati