2017-05-22 14 views
0

私はdictに私が輸入したcsvファイルを持っています。 辞書を繰り返し処理し、リンクを取得してリストに渡してbs4に反復する方法はありますか?dictを繰り返し、3行しか使用しない

with open('/Users/paribaker/Google Drive/Paxwin/Data/cits.csv') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     for k, v in row.items(): 
      print(k, v) 

結果は次のとおりです。あなたの出力に基づいて

id 166 
city NO Norway 
link http://www.fallingrain.com/world/NO/ 
id 167 
city NP Nepal 
link http://www.fallingrain.com/world/NP/ 
id 168 
city NR Nauru 
link http://www.fallingrain.com/world/NR/ 
id 169 
city NS Suriname 
link http://www.fallingrain.com/world/NS/ 
id 170 
city NU Nicaragua 
link http://www.fallingrain.com/world/NU/ 
+0

ここではdictreaderが役に立たないようです。データは各行で異なります。あなたの入力ファイルのサンプルを見れば助けになります。 –

+2

'[行['リンク']リーダーの行]' –

答えて

3

with open("/Users/paribaker/Google Drive/Paxwin/Data/cits.csv") as f: 
    reader = csv.DictReader(f) 
    links = [row["link"] for row in reader] 
    print(links) # or do whatever you want with the list... 

編集: 入力CSVは、(数百万行のような)巨大である場合は、あなたがかもしれませんlink列の場所を見つけて、各行をdictに変換する代わりにリストとして読み取る必要があります。次のようなものがあります:

with open("/Users/paribaker/Google Drive/Paxwin/Data/cits.csv") as f: 
    reader = csv.reader(f) 
    index = next(reader).index("link") 
    links = [row[index] for row in reader] 
    print(links) # or do whatever you want with the list... 
+0

dictへの変換はそれほど高価ではありません。 CSVが巨大な場合は、OPのように1つのリストにするのではなく、繰り返し実行して、行ごとに行を処理する必要があります。 –

+0

あなた自身で行うよりもはるかに高価です。私のシステムでは、OPsのCSV構造と百万行が最初のものは4.3秒かかり、2番目のものは0.8しかかかりません。 3つ以上の列がある場合、その差ははるかに大きくなります。はい、あなたも手で行を解析することができますし、おそらくもう半分の時間を削りますが、 'csv'モジュールは引用やエスケープのような事実を正しく処理します。あなたが実際にそれを必要としないときに 'DictReader'を使います。 – zwer

+0

確かに、そのような大量のデータ処理のために、あなたは正しいですが、利便性はおそらく風に投げられるべきです。 –

関連する問題