2011-10-24 4 views
4

CSV.dictReader를 사용하여 CSV를 읽는 경우 CSV의 특정 열을 무시하면 어떻게됩니까?Python CSV DictReader는 열을 무시합니까?

예를 들어

,

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

그리고 난 그냥 폐기하고 나머지는 무시하고 판독기를 사용하여 ID와 이름을 싶어. 난 필드 이름을 사용하여 시도했지만 여전히 그것을 읽고 그것을 "없음"으로 설정합니다. 나는 csv.DictWriter가 'ignore'기능을 가지고 있지만 DictReader가 그렇지 않은 것으로 보았다. 이 작업을 수행하는보다 우아한 방법이 있었으면 좋았을뿐입니다. 다른 CSV에 원하는 열만 읽은 다음 DictReader를 사용하여 추가 처리를 수행하는 CSV를 읽는 것입니다.

고마워요!

답변

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 이후에 모델링하십시오.