모든 '키 : 값'에 대해 한 줄씩 csv 파일에 사전 쓰기


92

사전이 있습니다.

mydict = {key1: value_a, key2: value_b, key3: value_c}

이 스타일로 dict.csv 파일에 데이터를 쓰고 싶습니다.

key1: value_a
key2: value_b
key3: value_c

나는 썼다 :

import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()

하지만 이제 한 행에 모든 키가 있고 다음 행에 모든 값이 있습니다.

이와 같은 파일을 작성하면 새 사전으로 다시 읽고 싶습니다.

내 코드를 설명하기 위해 사전에는 textctrl 및 확인란의 값과 bool이 포함되어 있습니다 (wxpython 사용). "설정 저장"및 "설정로드"버튼을 추가하고 싶습니다. 저장 설정은 앞서 언급 한 방식으로 파일에 사전을 작성해야하며 (사용자가 csv 파일을 직접 쉽게 편집 할 수 있도록)로드 설정은 파일에서 읽고 textctrls 및 확인란을 업데이트해야합니다.


1
출력으로 원하는 것에 대한 더 나은 예를 제공 할 수 있습니까? 위에있는 "스타일"은 CSV가 아닙니다. 찾고 key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c계십니까?
tkone dec.

또 다른 접근 방식은 repr()dict를 작성하고 읽을 때 문자열을 평가하는 데 사용 하는 것입니다.이 오래된 SO 게시물 에서 str()vs. repr()docs 에 대한 토론을 살펴보십시오 .
Peter Rowell 2011

당신이 뭔가 좀 더 정교한 단지 일반 CSV 파일보다를 선호하는 경우는 별도로 내 대답은 아래에서, 당신은 확인 할 수 있습니다 ConfigParser모듈
리카르도 Cárdenes

3
설명하는 것은 csv 모듈에서 작성한 일반적인 CSV 형식입니다. 동일한 키로 여러 딕셔너리를 작성하는 경우 키는 첫 번째 줄에 한 번만 기록되며 해당 값에 대해 dict 당 한 줄씩 1 줄의 키와 일렬로 정렬됩니다.
PaulMcG

답변:


188

DictWriter예상대로 작동하지 않습니다.

with open('dict.csv', 'w') as csv_file:  
    writer = csv.writer(csv_file)
    for key, value in mydict.items():
       writer.writerow([key, value])

다시 읽으려면 :

with open('dict.csv') as csv_file:
    reader = csv.reader(csv_file)
    mydict = dict(reader)

매우 간결하지만 읽을 때 유형 변환을 수행 할 필요가 없다고 가정합니다.


2
Mmh ... 정확히 CSV와 같은 형식이 아닌 특정 형식을 원한다는 것을 알아 차 렸습니다. 원하는 작업 ... CSV 모듈을 사용하고 있기 때문에 당신이 CSV 스타일 (. 즉, 키 - 값 쌍 당 행) 원 가정
리카르도 Cárdenes에게

3
또는 ... CSV 접근 방식이 정확히 원하는 것이지만 구분 기호로 ":"를 선호 delimiter=':'하는 경우 작성자와 독자를 만들 때 추가하기 만하면 됩니다. :)
Ricardo Cárdenes dec

2
쓰기와 읽기 사이에 파일을 닫아야합니다. 이 질문 / 대답에 무슨 일이 있었는지를 참조하십시오 : stackoverflow.com/a/38467563/235698
마크 Tolonen

1
@MarkTolonen 확실히 사용 with하면 더 좋을 것입니다. 나는 ... 그것을 반영하기 위해 예를 변경할 수 있습니다
리카르도 Cárdenes에게

1
@DareYang 지연 죄송합니다. 사실 그 당시에 왜 썼는지 모르겠습니다. 필요하지 않습니다. 쓸 때,이 효과는 번역되지 않은 줄 바꿈 문자를 떠나야하는 것입니다 (예. 당신이 작성하는 경우 \n, 당신은 얻을 것이다 \n파일에). 그대로두면 "유니버설 모드"가 시작되고 줄 바꿈이 현재 운영 체제의 기본값으로 변환됩니다. 여기서는 실제로 유용하지 않다는 점을 감안할 때 (예측 가능한 줄 바꿈을 원하는 경우를 제외하고) 제거하겠습니다.
Ricardo Cárdenes

28

옵션을 제공하기 위해 pandas 패키지를 사용하여 csv 파일에 사전을 작성할 수도 있습니다. 주어진 예제를 사용하면 다음과 같을 수 있습니다.

mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}

import pandas as pd

(pd.DataFrame.from_dict(data=mydict, orient='index')
   .to_csv('dict_file.csv', header=False))

고려해야 할 주요 사항은 from_dict 메서드 내에서 'orient'매개 변수를 'index'로 설정하는 것입니다. 이렇게하면 각 사전 키를 새 행에 쓸 것인지 선택할 수 있습니다.

추가로 to_csv 메소드 내에서 헤더 매개 변수는 성가신 행없이 사전 요소 만 갖도록 False로 설정됩니다. to_csv 메서드 내에서 항상 열 및 인덱스 이름을 설정할 수 있습니다.

출력은 다음과 같습니다.

key1,a
key2,b
key3,c

대신 키가 열의 이름이되도록하려면 문서 링크에서 확인할 수 있으므로 'columns'인 기본 'orient'매개 변수를 사용하십시오.


2
매력처럼 훌륭하게 작동했습니다 :). 내 값은 목록이었고 모든 목록 값이 여러 셀에있는 내 csv를 생성하고 첫 번째 열의 키에 매핑되었습니다.
vinsinraw

14

가장 쉬운 방법은 csv 모듈을 무시하고 직접 포맷하는 것입니다.

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]

9
key쉼표가 있으면 안 좋은 시간을 보낼 것입니다.
알리 아쉬 라프

5
그냥 사용하는 것이 더 쉽습니다 csv.writer(...).writerows(my_dict.items()). csv모듈은 훨씬 더 이상의 단지 콤마와 줄 바꿈을 추가 않습니다.
Martijn Pieters

6
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )

1
또한 귀하의 답변에 대한 정보 나 의견을 제공해주십시오.
NDM 2013 년

2

당신은 할 수 있습니다 :

for key in mydict.keys():
    f.write(str(key) + ":" + str(mydict[key]) + ",");

당신이 가질 수 있도록

key_1 : value_1, key_2 : value_2


3
더 좋을 것입니다 ','.join("%s:%s" % (k,v) for k,v in mydict.items())-일반적으로 dict의 키와 'n'값 조회를 수행하는 것보다 키와 값을 함께 제공하는 dict의 항목을 반복하는 것이 좋습니다. ','.join(...)추가 후행 쉼표를 추가하지 않고 값 사이에 쉼표 만 넣는 작업을 처리합니다.
PaulMcG

참고이 파이썬 코드의 끝에 세미콜론이 필요하지 않습니다
beep_check

1

저는 개인적으로 항상 csv 모듈이 짜증나는 것을 발견했습니다. 나는 다른 누군가가 당신에게 그것을 매끄럽게하는 방법을 보여줄 것이라고 기대하지만, 내 빠르고 더러운 해결책은 다음과 같습니다.

with open('dict.csv', 'w') as f:  # This creates the file object for the context 
                                  # below it and closes the file automatically
    l = []
    for k, v in mydict.iteritems(): # Iterate over items returning key, value tuples
        l.append('%s: %s' % (str(k), str(v))) # Build a nice list of strings
    f.write(', '.join(l))                     # Join that list of strings and write out

그러나 다시 읽으려면 짜증나는 구문 분석을 수행해야합니다. 특히 모두 한 줄에있는 경우에는 더욱 그렇습니다. 다음은 제안 된 파일 형식을 사용한 예입니다.

with open('dict.csv', 'r') as f: # Again temporary file for reading
    d = {}
    l = f.read().split(',')      # Split using commas
    for i in l:
        values = i.split(': ')   # Split using ': '
        d[values[0]] = values[1] # Any type conversion will need to happen here

나는 Ricardo의 대답으로 갈 것입니다. 또는 적어도 별도의 줄을 사용하십시오.
Griffith Rees

0
import csv

dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"}

with open("test.csv", "w") as f:
    writer = csv.writer(f)
    for i in dict:
      writer.writerow([i, dict[i]])
f.close() 

여기에 이미지 설명 입력


마지막 줄에서 파일을 명시 적으로 닫을 필요는 없다고 생각합니다. 컨텍스트 관리자가이를 수행합니다.
avaj_wen12

0
#code to insert and read dictionary element from csv file
import csv
n=input("Enter I to insert or S to read : ")
if n=="I":
    m=int(input("Enter the number of data you want to insert: "))
    mydict={}
    list=[]
    for i in range(m):
        keys=int(input("Enter id :"))
        list.append(keys)
        values=input("Enter Name :")
        mydict[keys]=values

    with open('File1.csv',"w") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=list)
        writer.writeheader()
        writer.writerow(mydict)
        print("Data Inserted")
else:
    keys=input("Enter Id to Search :")
    Id=str(keys)
    with open('File1.csv',"r") as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            print(row[Id]) #print(row) to display all data

약간의 설명을 추가하면 더 좋을 것입니다
Roaim 2010 년

-2

다음 w.writerow(mydict)과 같이 "s"를 추가하려고 했습니까 w.writerows(mydict)? 이 문제는 나에게 발생했지만 목록에서는 복수 대신 단수를 사용했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.