Warum setzt csvwriter.writerow () nach jedem Zeichen ein Komma?

97

Dieser Code öffnet die URL und hängt die /namesam Ende an und öffnet die Seite und druckt die Zeichenfolge an 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)

Aber ich bekomme dieses Ergebnis:

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

Wenn ich den String in ("JD", "Columbia Law School" ....) ändere, bekomme ich

JD, Columbia Law School...)

Ich konnte in der Dokumentation nicht finden, wie das Delimeter angegeben werden soll.

Wenn ich versuche zu verwenden, delimentererhalte ich diesen Fehler:

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

Danke für die Hilfe.

Zeynel
quelle
8
Es ist delimiterund nicht delimeter: docs.python.org/library/csv.html
John Paulett
Wenn Sie dieses Problem mit writer.writerow s haben , übergeben Sie ihm eine Liste mit Listen und keine Liste mit Zeichenfolgen.
Noumenon

Antworten:

148

Es erwartet eine Folge (z. B. eine Liste oder ein Tupel) von Zeichenfolgen. Du gibst ihm eine einzelne Saite. Eine Zeichenfolge ist zufällig auch eine Folge von Zeichenfolgen, aber es ist eine Folge von Zeichenfolgen mit 1 Zeichen, was nicht das ist, was Sie wollen.

Wenn Sie nur eine Zeichenfolge pro Zeile möchten, können Sie Folgendes tun:

csvwriter.writerow([JD])

Dies umschließt JD (eine Zeichenfolge) mit einer Liste.

Laurence Gonsalves
quelle
Vielen Dank! Dies hat es behoben. Ich werde auch andere Antworten versuchen. Ich habe auch eine leere Liste JDList = [] erstellt und JD daran angehängt, das funktioniert auch, aber das ist einfacher.
Zeynel
1
Jetzt werden auch die Anführungszeichen der Zeichenfolge geschrieben. Gibt es einen Weg, das zu umgehen?
CGFoX
@CGFoX Können Sie einen Beispielcode veröffentlichen, der dies demonstriert?
Laurence Gonsalves
writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])schreibt die datetime als"2016-11-05 20:30:19"
CGFoX
@CGFoX Ich kann dieses Verhalten nicht reproduzieren. Ich bekomme 2016-11-05 13:21:11ohne Anführungszeichen. Welche Version von Python verwenden Sie?
Laurence Gonsalves
5

Die Klasse csv.writer verwendet eine iterable als Argument für writerow. Da Zeichenfolgen in Python nach Zeichen iterierbar sind, sind sie ein akzeptables Argument für Writerow, aber Sie erhalten die obige Ausgabe.

Um dies zu korrigieren, können Sie den Wert basierend auf Leerzeichen aufteilen (ich gehe davon aus, dass Sie dies möchten).

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

Dies geschieht, weil wenn die group () -Methode einer MatchObject-Instanz nur einen einzelnen Wert zurückgibt, dieser als Zeichenfolge zurückgegeben wird. Wenn mehrere Werte vorhanden sind, werden sie als Tupel von Zeichenfolgen zurückgegeben.

Wenn Sie eine Zeile schreiben, iteriert csv.writer vermutlich über das Objekt, das Sie an das Objekt übergeben. Wenn Sie eine einzelne Zeichenfolge übergeben (die iterierbar ist), durchläuft sie ihre Zeichen und erzeugt das beobachtete Ergebnis. Wenn Sie ein Tupel von Zeichenfolgen übergeben, wird bei jeder Iteration eine tatsächliche Zeichenfolge und kein einzelnes Zeichen angezeigt.

shylent
quelle