2009-11-29 5 views
56

このコードは、URLを開き、最後に/namesを追加し、ページを開き、test1.csvに文字列を出力します。なぜcsvwriter.writerow()は各文字の後にコンマを入れますか?

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"、 "コロンビアロースクール" ....)は、私が得る

JD, Columbia Law School...)

ドキュメンテーションでdelimeterを指定する方法が見つかりませんでした。

私はdelimenterを使用しようとすると、私はこのエラーを取得する:助けを

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

感謝を。

+8

それは 'delimiter'なく' delimeter'です:のhttp://docs.python。 org/library/csv.html –

答えて

90

文字列のシーケンス(たとえば、リストまたはタプル)が必要です。あなたはそれを単一の文字列にしています。文字列は文字列のシーケンスでもありますが、それは1文字列のシーケンスです。これはあなたが望むものではありません。あなただけの行ごとに1つの文字列をしたい場合は

あなたはこのような何かを行うことができます:

csvwriter.writerow([JD]) 

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

+0

ありがとう!これで修正されました。他の答えも試してみるよ。私も空のリストJDList = []を作成し、それにJDを追加しました。これも動作しますが、これは簡単です。 – Zeynel

+0

まだ役に立ちました:) – PhilipB

+1

これで、文字列の引用符も書きます。その周りに道がありますか? – CGFoX

1

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

行を書く場合、csv.writerは渡すオブジェクトを反復処理すると思います。単一の文字列(繰り返し可能な文字列)を渡すと、その文字を繰り返し処理し、結果を生成します。文字列の組を渡すと、実際の文字列が取得されます。反復ごとに1つの文字は取得されません。

5

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

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

csvwriter.writerow(JD.split())