हर 'की: वैल्यू' के लिए एक लाइन के साथ सीएसवी फाइल का डिक्शनरी लिखना


90

मुझे एक शब्दकोष मिला है:

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

मैं किसी फ़ाइल को डेटा इस तरह से लिखना चाहता हूं।

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 का उपयोग करके) शामिल हैं। मैं "सेटिंग्स सहेजें" और "लोड सेटिंग्स" बटन जोड़ना चाहता हूं। सेव सेटिंग्स को फ़ाइल को डिक्शनरी में उल्लिखित तरीके से लिखना चाहिए (उपयोगकर्ता के लिए सीएसवी फ़ाइल को सीधे संपादित करना आसान बनाने के लिए), लोड सेटिंग्स को फाइल से पढ़ा जाना चाहिए और टेक्स्टट्रेल्स और चेकबॉक्स को अपडेट करना चाहिए।


1
क्या आप आउटपुट के रूप में जो चाहते हैं उसका बेहतर उदाहरण प्रदान कर सकते हैं? आपके ऊपर "स्टाइल" CSV नहीं है। क्या आप ढूंढ रहे हैं key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c?
tkone

एक और तरीका यह है repr()कि जब आप इसे पढ़ते हैं तो ताना को लिखने के लिए उपयोग करें और फिर स्ट्रिंग को बाहर निकालें। इस पुराने एसओ पोस्ट को str()बनाम repr(), और डॉक्स की चर्चा के लिए देखें ।
पीटर रोवेल

नीचे मेरे जवाब के अलावा, अगर आप किसी सादे CSV फ़ाइल की तुलना में कुछ अधिक परिष्कृत पसंद करते हैं, तो आप ConfigParserमॉड्यूल की जांच करना चाहते हैं
रिकार्डो Cárdenes

3
आप जो वर्णन करते हैं वह सीएसवी मॉड्यूल द्वारा लिखा गया विशिष्ट सीएसवी प्रारूप है। यदि आप समान कुंजियों वाली अनेक dicts लिखने, कुंजी केवल एक बार पहली पंक्ति में, संगत मानों के लिए dict प्रति एक लाइन के साथ, लाइन 1 में कुंजी के साथ पंक्तिबद्ध करने के लिए उचित क्रम में लिखा जाता है,
PaulMcG

जवाबों:


185

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
मम् ... बस ध्यान दिया कि आप एक विशिष्ट प्रारूप चाहते थे जो सीएसवी जैसा नहीं है। माना जाता है कि आप CSV स्टाइल (यानी कुंजी-मूल्य जोड़ी की एक पंक्ति) चाहते थे क्योंकि आप CSV मॉड्यूल का उपयोग कर रहे थे ...
रिकार्डो सेरडेंस

3
या ... मामले में CSV का दृष्टिकोण वही है जो आप चाहते थे, लेकिन आप पसंद करते हैं ":" एक विभाजक के रूप में, बस delimiter=':'लेखक और पाठक को बनाते समय जोड़ें :)
रिकार्डो कॉर्डेन

2
ध्यान दें, आपको फ़ाइल को लिखने और पढ़ने के बीच बंद करना चाहिए। देखिए क्या हुआ इस सवाल / जवाब में: stackoverflow.com/a/38467563/235698
मार्क टॉलेनन

1
@MarkTolonen निश्चित रूप से, का उपयोग withकरना बेहतर होगा। मैं इसे दर्शाने के लिए उदाहरण
बदलूँगा

1
@DareYang देरी के लिए खेद है। वास्तव में, मुझे यकीन नहीं है कि मैंने इसे वापस क्यों लिखा। इसकी जरूरत नहीं है। लिखते समय, इसका प्रभाव न्यूलाइन वर्णों को अनियंत्रित छोड़ देना है (यानी यदि आप लिखते हैं \n, तो आप \nफ़ाइल में मिल जाएंगे )। यदि अकेला छोड़ दिया जाता है, तो "सार्वभौमिक मोड" चालू हो जाता है और नई लाइनें वर्तमान ऑपरेटिंग सिस्टम के लिए डिफ़ॉल्ट में अनुवादित हो जाती हैं। यह देखते हुए कि यह वास्तव में यहाँ उपयोगी नहीं है (सिवाय इसके कि यदि आप पूर्वानुमानित नई सुचना चाहते हैं), तो मैं इसे हटा दूँगा।
रिकार्डो कॉर्डेनस

27

बस एक विकल्प देने के लिए, 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))

मुख्य बात यह है कि ध्यान रखने की विधि से 'इंडेक्स' के लिए 'ओरिएंट' पैरामीटर सेट करना है । इससे आप चुन सकते हैं कि क्या आप प्रत्येक शब्द कुंजी को एक नई पंक्ति में लिखना चाहते हैं।

अतिरिक्त, to_csv पद्धति के अंदर हेडर पैरामीटर केवल झूठी तत्वों को बिना कष्टप्रद पंक्तियों के लिए गलत करने के लिए सेट किया गया है। आप हमेशा to_csv विधि के अंदर कॉलम और इंडेक्स नाम सेट कर सकते हैं।

आपका आउटपुट इस तरह दिखेगा:

key1,a
key2,b
key3,c

यदि इसके बजाय आप चाहते हैं कि चाबियाँ कॉलम के नाम हों, तो बस डिफ़ॉल्ट 'ओरिएंट' पैरामीटर का उपयोग करें जो 'कॉलम' है, जैसा कि आप दस्तावेज़ लिंक में देख सकते हैं।


2
उत्कृष्ट एक आकर्षण की तरह काम किया :)। मेरा मूल्य एक सूची थी और इसने कई कोशिकाओं में सभी सूची मूल्यों के साथ मेरे सीएसवी को उत्पन्न किया और पहले कॉलम में कुंजी के लिए मैप किया।
vinsinraw

14

सबसे आसान तरीका सीएसवी मॉड्यूल को अनदेखा करना और इसे स्वयं प्रारूपित करना है।

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

8
यदि आपका keyअल्पविराम हो जाता है, तो आपका समय खराब होने वाला है।
अली अशरफ

5
मुझे इसका उपयोग करना आसान लगता है csv.writer(...).writerows(my_dict.items())csvमॉड्यूल इतना अधिक से अधिक बस के लिए अल्पविराम और नई-पंक्तियों को जोड़ने है।
मार्टिन पीटर्स

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

1
कृपया अपने उत्तर पर कुछ जानकारी या टिप्पणी भी दें।
NDM

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())- आप आमतौर पर एक तानाशाह की वस्तुओं की तुलना में अधिक बेहतर होते हैं, जो आपको एक तानाशाही की चाबी की तुलना में कुंजी और मूल्य देता है, और 'एन' मान लुकअप करता है। ','.join(...)अतिरिक्त अनुगामी अल्पविराम को जोड़े बिना मूल्यों के बीच केवल अल्पविराम लगाने का ख्याल रखता है।
पॉलएमसीजी

ध्यान दें कि आपको इस अजगर कोड के लिए अंत में अर्धविराम की आवश्यकता नहीं होगी
beep_check

1

मैंने व्यक्तिगत रूप से हमेशा सीएसवी मॉड्यूल को कष्टप्रद पाया है। मुझे उम्मीद है कि कोई और आपको यह दिखाएगा कि इसके साथ यह कैसे करना है, लेकिन मेरा त्वरित और गंदा समाधान है:

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

मैं रिकार्डो के जवाब के साथ जाऊंगा। या कम से कम अलग लाइनों का उपयोग करें।
ग्रिफ़िथ रीस

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

-2

क्या आपने w.writerow(mydict)इस तरह से "एस" जोड़ने की कोशिश की है w.writerows(mydict):? यह मुद्दा मेरे साथ हुआ लेकिन सूचियों के साथ, मैं बहुवचन के बजाय एकवचन का उपयोग कर रहा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.