2011-10-24 5 views
4

CSVで読み込むためにCSV.dictReaderを使用している場合、CSVの特定の列を無視する方法はありますか?例えばPython CSV DictReaderは列を無視しますか?

"id","name","address","number","created" 
"123456","someName","someAddress","someNumber","2003-5-0294" 

そして私はちょうど残りの部分を破棄し、無視して、リーダーを使用して、IDと名前を取得したいです。私はフィールド名を使ってみましたが、まだそれを読み込んで "なし"と設定しています。私はcsv.DictWriterは '無視'機能を持っていることに気付いたが、DictReaderはそうではないようだ。私は別のCSVにしたいと思っている列だけを読んでから、DictReaderを使ってそれ以上の処理をしているのです。

ありがとうございました!

答えて

5

この単純なジェネレータが行います。

def dict_filter(it, *keys): 
    for d in it: 
     yield dict((k, d[k]) for k in keys) 

すると、このようにそれを使用します。

dreader = [{'id':1, 'name':'Bob', 'other_stuff':'xy'}, 
      {'id':2, 'name':'Jen', 'other_stuff':'xx'}] 

for d in dict_filter(dreader, 'id', 'name'): 
    print d 

が与える:

{'id': 1, 'name': 'Bob'} 
{'id': 2, 'name': 'Jen'} 
4

各行を読み取り、必要なキーだけで辞書のリストを作成します。

[{'id':r['id'], 'name':r['name']} for r in mydictreader] 
+0

それはうまくいくはずです。 –

2
from operator import itemgetter 

cols=('name', 'id') #Tuple of keys you want to keep 
valuesfor=itemgetter(*cols) 

for d in dictreader_input: 
    print dict(zip(cols, valuesfor(d))) # dict from zipping cols and values 
3

他の投稿ソリューションはDictReaderによって返された大きなフル装備dictsから新しい小さなdictsを構築します。

DictReader APIがフィールドをスキップしないように意図的に設計されているため、このようなことが必要になります。ここでは、ソースからの抜粋です:

# unlike the basic reader, we prefer not to return blanks, 
    # because we will typically wind up with a dict full of None 
    # values 
    while row == []: 
     row = self.reader.next() 
    d = dict(zip(self.fieldnames, row)) 

あなたはすべてのフィールド名がフィルタリングなしで辞書に割り当てられますことがわかります。

FWIW、それはDictReaderのあなた自身の変種が望ましい挙動になることを難しくしていません。それは既存のCSV sourceの後にモデル化します。

関連する問題