2011-11-30 6 views
20

CSV를 파이썬 사전에 읽을 수있는 코드를 작성 했으므로 잘 작동합니다. CSV로 사전을 다시 가져 오려고합니다. 나는 다음을 썼다 :CSV 로의 파이썬 사전

import csv 

itemDict={} 

listReader = csv.reader(open('/Users/broberts/Desktop/Sum_CSP1.csv','rU'), delimiter = ',', quotechar='|') 

for row in listReader: 
    fID = row[0] 
    fClassRange = row[1] 
    fArea = row[2] 

    if itemDict.has_key(fID): 
     itemDict[fID][fClassRange]=fArea 
    else: 
     itemDict[fID] = {'5.0 to 5.25':'','5.25 to 5.5':'','5.5 to 5.75':'','5.75 to 6.0':'','6.0 to 6.25':'','6.25 to 6.5':'','6.5 to 6.75':'','6.75 to 7.0':'','7.0 to 7.25':'','7.25 to 7.5':'','7.5 to 7.75':'','7.75 to 8.0':'','8.0 to 8.25':'',} 
     itemDict[fID][fClassRange]=fArea 

listWriter = csv.writer(open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 

for a in itemDict: 
    print a 
    listWriter.writerow(a) 

마지막 블록에서 listWriter는 a를 인쇄 할지라도 CSV에 아무 것도 쓰지 않을 것이다. 나는 이것이 사전이 정렬되지 않은 사전과 관련이 있다고 생각한다. 필자는 실제로 fID와 각 fID (fClassRange ex. "5.0 to 5.25")와 연관된 키 각각을 작성해야하고 CSV에 대한 각 fClassRange와 연관된 값 fArea를 작성해야하지만 아직까지는 그렇게까지 얻지 못했습니다. 내 코드는 fID를 작성하는 방법을 알지 못하기 때문에.

나는 DictWriter을 사용하여 조사했지만, 필요한 번호 이 무엇인지 알려주는 방법을 찾지 못했습니다.

+0

는 케네스 리츠의 [tablib] (HTTP를 추천 할을 : // docs.python-tablib.org/en/latest/). 여기서 찾고있는 것 이상을 수행하므로 직접 응답이 아니므로이 라이브러리를 다른 사람들에게 추천하고 싶습니다. 크고 사용하기 쉬운 API가 있으며 csv, tsv, json, yaml 및 xlsx로 간편하게 직렬화 할 수 있습니다. – hangtwenty

답변

18

기본 작성자는 목록이 필요하기 때문에 목록이 필요하지 않습니다. 이 필드 있어야 할 무엇을 알고 있다면 당신은 그냥 fieldnames=['arbitrary','list','of','keys']을 할 fieldnames을 설정할 수 있습니다

listWriter = csv.DictWriter(
    open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), 
    fieldnames=itemDict[itemDict.keys()[0]].keys(), 
    delimiter=',', 
    quotechar='|', 
    quoting=csv.QUOTE_MINIMAL 
) 

을 또는 : dictwriter를 사용하려면이에 listwriter = 라인을 변경합니다. 후손을 위해

+0

와우, 고마워! 하지만 지금은이 메시지가 나타납니다. ValueError : dict에 필드 이름이 아닌 필드가 있습니다 : 4, 6, 3, 3, 9 – bojo

+0

@bojo 웁스! 당신은 딕트 (dicts)를 쓰는 중입니다. 올바른 필드 이름을 얻으려면 * 내부 사전 * 필드 이름이 필요합니다. 또한 각 사전에는 동일한 필드 이름이 있어야합니다. 그렇지 않으면 잘못된 필드 이름에 대해 DictWriter 옵션을 사용해야합니다. 필드 이름을 가져 오기 위해 올바른 사전을 사용하도록 라인을 업데이트했습니다. –

+0

죄송합니다. 스펜서, 아직 동일한 ValueError 메시지를 받고 있습니다. – bojo

1

: 마지막 부분이, 내가 무엇을 사용 그것의 간단하고 나를 위해 잘 작동

for name, values in itemDict.iteritems(): 
    print values 
    listWriter.writerow(values) 
1

가되도록

당신은 iteritems를 사용한다(), 사전을 반복합니다. 당신은 하나 개의 사전을 가질 때 SQL 쿼리에서 무엇을 얻을, 당신이 좋아하는 것처럼 당신이 사전의 목록을 때 이

my_dict = {"tester": 1, "testers": 2} 
with open('mycsvfile.csv', 'wb') as f: 
    w = csv.DictWriter(f, my_dict.keys()) 
    w.writerow(dict((fn,fn) for fn in my_dict.keys())) 
    w.writerow(my_dict) 

$ cat mycsvfile.csv 
testers,tester 
2,1 

사용합니다.

my_dict = ({"tester": 1, "testers": 2},{"tester": 14, "testers": 28}) 
with open('mycsvfile.csv', 'wb') as f: 
    w = csv.DictWriter(f, my_dict[0].keys()) 
    w.writerow(dict((fn,fn) for fn in my_dict[0].keys())) 
    w.writerows(my_dict) 

cat mycsvfile.csv 
testers,tester 
2,1 
28,14 
1

팬더 사용하여 CSV에 dicts의 목록을 변환 한 라이너 :

import pandas as pd 

mydict = [{"col1": 1000, "col2": 2000}, {"col1": 3000, "col2": 4000}] 

pd.DataFrame(mydict).to_csv('out.csv', index=False) 

결과 :

col1,col2 
1000,2000 
3000,4000