programing

'key: value'마다 한 줄씩 사용하여 CSV 파일에 사전 쓰기

closeapi 2023. 8. 4. 23:05
반응형

'key: value'마다 한 줄씩 사용하여 CSV 파일에 사전 쓰기

나는 사전을 가지고 있습니다.

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()

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

제가 이런 파일을 쓸 수 있을 때, 저는 또한 그것을 새로운 사전으로 다시 읽고 싶습니다.

내 코드를 설명하기 위해, 사전에는 (wxpython을 사용하여) 텍스트ctrls 및 확인란의 값과 부울이 포함되어 있습니다."설정 저장" 및 "설정 로드" 버튼을 추가하고 싶습니다.저장 설정은 사용자가 csv 파일을 직접 편집하기 쉽게 하기 위해 언급된 방법으로 사전을 파일에 써야 하며 로드 설정은 파일에서 읽고 텍스트 ctrl 및 확인란을 업데이트해야 합니다.

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)

꽤 컴팩트하지만 읽을 때는 어떤 유형 변환도 할 필요가 없다고 가정합니다.

옵션을 제공하기 위해 사전을 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

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

@Rabarberski의 코멘트를 고려하여, 사용할 때orient='columns다음과 같이 데이터를 구성해야 합니다.

d = {k: [v] for k, v in mydict.items()}

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

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )

당신은 그냥 할 수 있습니까?

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

당신이 가질 수 있도록.

key_1: value_1, key_2: value_2

저는 개인적으로 항상 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
#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

은 "를 "s"에?w.writerow(mydict)와 같이: 과같이다음:w.writerows(mydict)이 문제는 저에게 발생했지만 목록에서 저는 복수형 대신 단수형을 사용했습니다.

언급URL : https://stackoverflow.com/questions/8685809/writing-a-dictionary-to-a-csv-file-with-one-line-for-every-key-value

반응형