web-dev-qa-db-ja.com

csvwriter.writerow()が各文字の後にコンマを置くのはなぜですか?

このコードは、URLを開き、最後に/namesを追加してページを開き、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)

しかし、私はこの結果を得ます:

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

文字列を( "JD"、 "Columbia Law School" ....)に変更すると、

JD, Columbia Law School...)

デリミターの指定方法をドキュメントで見つけることができませんでした。

delimenterを使用しようとすると、次のエラーが表示されます。

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

助けてくれてありがとう。

78
Zeynel

文字列のシーケンス(例:リストまたはタプル)が必要です。単一の文字列を与えています。文字列はたまたま文字列のシーケンスでもありますが、1文字の文字列のシーケンスであり、これは望みではありません。

行ごとに1つの文字列が必要な場合は、次のようにできます。

csvwriter.writerow([JD])

これは、JD(文字列)をリストでラップします。

114

Csv.writerクラスは、writerowの引数としてiterableを取ります。 Pythonの文字列は文字ごとに反復可能であるため、writerowの引数として受け入れられますが、上記の出力が得られます。

これを修正するには、空白に基づいて値を分割することができます(私はそれがあなたが望むものだと仮定しています)

csvwriter.writerow(JD.split())
5
Gabriel Reid

これは、MatchObjectインスタンスのgroup()メソッドが単一の値のみを返す場合、文字列として返すためです。複数の値がある場合、それらは文字列のタプルとして返されます。

行を書いている場合、csv.writerは、渡されたオブジェクトを反復処理していると思います。単一の文字列(反復可能)を渡すと、その文字を反復処理して、観察している結果を生成します。文字列のタプルを渡すと、反復ごとに1文字ではなく、実際の文字列が取得されます。

1
shylent