Perché csvwriter.writerow () mette una virgola dopo ogni carattere?


97

Questo codice apre l'URL e aggiunge /namesalla fine e apre la pagina e stampa la stringa su 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)

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 in ("JD", "Columbia Law School" ....) allora ottengo

JD, Columbia Law School...)

Non sono riuscito a trovare nella documentazione come specificare il delimetro.

Se provo a utilizzare delimenterottengo questo errore:

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

Grazie per l'aiuto.


8
È delimitere non è delimeter: docs.python.org/library/csv.html
John Paulett,

Se stai ricevendo questo problema con writer.writerow s , passare una lista di liste e non una lista di stringhe.
Noumenon

Risposte:


148

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

Se vuoi solo una stringa per riga, potresti fare qualcosa del genere:

csvwriter.writerow([JD])

Questo avvolge JD (una stringa) con un elenco.


Grazie! Questo l'ha risolto. Proverò anche altre risposte. Ho anche creato un elenco vuoto JDList = [] e aggiunto JD a quello, anche questo funziona ma è più semplice.
Zeynel,

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

@CGFoX Puoi pubblicare un codice di esempio che lo dimostri?
Laurence Gonsalves

writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])scrive il datetime come"2016-11-05 20:30:19"
CGFoX

@CGFoX Non riesco a riprodurre quel comportamento. Ottengo 2016-11-05 13:21:11senza virgolette. Quale versione di Python stai usando?
Laurence Gonsalves

5

La classe csv.writer accetta un iterabile come argomento per writerow; poiché le stringhe in Python sono iterabili per carattere, sono un argomento accettabile per writerow, ma ottieni l'output sopra.

Per correggere questo, potresti dividere il valore in base agli spazi (presumo che sia quello che vuoi)

csvwriter.writerow(JD.split())

1

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

Se stai scrivendo una riga, immagino, csv.writer itera sull'oggetto che gli passi. Se passi una singola stringa (che è un iterabile), itera sui suoi caratteri, producendo il risultato che stai osservando. Se passi una tupla di stringhe, ottiene una stringa effettiva, non un singolo carattere ad ogni iterazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.