पाठ फ़ाइल में एक शब्दकोश लिखना?


86

मेरे पास एक शब्दकोश है और मैं इसे एक फ़ाइल में लिखने की कोशिश कर रहा हूं।

exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
    file.write(exDict)

मैं तो त्रुटि है

file.write(exDict)
TypeError: must be str, not dict

इसलिए मैंने उस त्रुटि को ठीक किया लेकिन एक और त्रुटि आई

exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
    file.write(str(exDict))

त्रुटि:

file.write(str(exDict))
io.UnsupportedOperation: not writable

मुझे नहीं पता कि मुझे क्या करना है क्योंकि मैं अभी भी अजगर पर शुरुआत कर रहा हूं। अगर किसी को पता है कि समस्या को कैसे हल किया जाए, तो कृपया जवाब दें।

नोट: मैं अजगर 3 का उपयोग कर रहा हूं, अजगर 2 का नहीं

जवाबों:


143

सबसे पहले आप फ़ाइल को रीड मोड में खोल रहे हैं और उसमें लिखने की कोशिश कर रहे हैं। परामर्श - IO मोड अजगर

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

import json

# as requested in comment
exDict = {'exDict': exDict}

with open('file.txt', 'w') as file:
     file.write(json.dumps(exDict)) # use `json.loads` to do the reverse

क्रमबद्धता के मामले में

import cPickle as pickle

with open('file.txt', 'w') as file:
     file.write(pickle.dumps(exDict)) # use `pickle.loads` to do the reverse

अजगर के लिए 3.x अचार पैकेज का आयात अलग होगा

import _pickle as pickle

1
वह काम किया! हालाँकि, यह केवल शब्दकोष की सामग्री लिखता है। क्या आप इसे लिख सकते हैं: exDict = {111: 111, 222: 222}
निक

मैंने इसके बारे में सोचा लेकिन सोचा कि एक बेहतर तरीका है। यह काम करता है, हालांकि बहुत धन्यवाद!
निक

यदि आप =साइन के साथ बहुत अधिक संलग्न नहीं हैं , तो मैंने जो संपादन किया है वह काम कर सकता है।
hspandher

जिस तरह से आपके पास पहले था: file.write ('exDict =' + json.dumps (exDict)) ने मेरे लिए ठीक काम किया क्योंकि मैं अभी इसका उपयोग कर रहा हूं।
निक

1
@JanKukacka JSON एक मानक डेटा प्रारूप है। क्या str(exDict)उत्पादन होगा हमेशा एक वैध JSON नहीं होगा। मेरे सिर के पीछे से एक कारण यह है कि एक JSON फ़ाइल में एकल उद्धरण मान्य नहीं हैं, जबकि हम strविधि का उपयोग करते समय मौजूद हो सकते हैं ।
hspandher

49

मैं इसे अजगर 3 में इस तरह से करता हूँ:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)

1
मुझे यह पसंद है क्योंकि कोई आयात आवश्यक नहीं है। Data.write (str (शब्दकोश)) के ऊपर उत्तर एक सही शब्दकोश के साथ काम नहीं करेगा क्योंकि यह आपकी फ़ाइल में सिर्फ <class 'dict'> लिखेगा
Si Mon

एक बात मैं भी उत्सुक हूँ कि सिर्फ प्रिंट (mydfox, फ़ाइल = ओपन ('myfile.txt', 'w') क्यों नहीं किया जाता है
MadmanLee

@ मैडमैन मुझे लगता है कि दोनों ठीक हैं, और यह इस बात का विषय है कि हम अपने कोड को कैसे पसंद करते हैं।
NKSHELL

1
खुले ('myfile.txt', 'r') के रूप में f: content = f.read (); dic = eval (सामग्री);
NKSHELL

सिर्फ str(mydict)एक फाइल पर लिखने से जसन बेहतर है इसका कारण यह है कि आपको ऑब्जेक्ट को वापस evalलाने के लिए सामग्री की आवश्यकता नहीं है dictevalएक सुरक्षा rosk है और इसका उपयोग नहीं किया जाना चाहिए यदि बेहतर विकल्प उपलब्ध हैं।
सांचेखेरम्ब

22
fout = "/your/outfile/here.txt"
fo = open(fout, "w")

for k, v in yourDictionary.items():
    fo.write(str(k) + ' >>> '+ str(v) + '\n\n')

fo.close()

12
कोड-केवल उत्तर हतोत्साहित किए जाते हैं क्योंकि वे यह नहीं समझाते हैं कि वे मुद्दे को कैसे हल करते हैं। कृपया यह बताने के लिए अपने उत्तर को अपडेट करें कि यह दूसरे स्वीकृत और उत्क्रमित उत्तर पर कैसे सुधार करता है। कृपया समीक्षा करें कि मैं एक अच्छा उत्तर कैसे लिखूं
फ्लिफकैटेन

इसके अलावा, आपको withफाइलों से पढ़ते और लिखते समय स्टेटमेंट का उपयोग करना चाहिए : stackoverflow.com/questions/3012488/…
फाल्को

13

आपके पहले कोड ब्लॉक के साथ संभावना यह थी कि आप फ़ाइल को 'आर' के रूप में खोल रहे थे, भले ही आप इसका उपयोग करके लिखना चाहते थे 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))

यह सही उत्तर है, क्योंकि प्रश्न के भीतर कोड में त्रुटि है।
रिकार्डो रिवाल्डो

जब मैं json मार्ग की कोशिश करता हूं, तो मुझे असफलता मिलती है क्योंकि मेरे पास कुछ "NaN" मान हैं। यदि आप JSON लिखना चाहते हैं, तो डेटा को नुकसान पहुंचाए बिना कोई फिक्स नहीं है। इसलिए, यह उत्तर पसंदीदा है क्योंकि यह एक पाठ फ़ाइल को सही ढंग से तानाशाही को प्रतिबिंबित करने के लिए बचा सकता है।
pauljohn32

7

यदि आप एक ऐसा शब्दकोश चाहते हैं जिसे आप किसी फ़ाइल से नाम से आयात कर सकते हैं, और यह भी प्रविष्टियों को जोड़ता है जो अच्छी तरह से सॉर्ट किए गए हैं, और इसमें वे तार हैं जिन्हें आप संरक्षित करना चाहते हैं, तो आप यह कोशिश कर सकते हैं:

data = {'A': 'a', 'B': 'b', }

with open('file.py','w') as file:
    file.write("dictionary_name = { \n")
    for k in sorted (data.keys()):
        file.write("'%s':'%s', \n" % (k, data[k]))
    file.write("}")

फिर आयात करने के लिए:

from file import dictionary_name

यह केवल स्ट्रिंग के लिए काम करता है, अन्य प्रकार के शब्दकोश में नहीं।
पॉल केनजोरा 18

4

सूची समझने वाले प्रेमियों के लिए, यह सभी key : valueजोड़ों को नई लाइनों में लिखेगाdog.txt

my_dict = {'foo': [1,2], 'bar':[3,4]}

# create list of strings
list_of_strings = [ f'{key} : {my_dict[key]}' for key in my_dict ]

# write string one by one adding newline
with open('dog.txt', 'w') as my_file:
    [ my_file.write(f'{st}\n') for st in list_of_strings ]

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैंने एक समाधान साझा करने के बारे में भी सोचा है जिसमें जसन शामिल नहीं है। मुझे व्यक्तिगत रूप से बहुत पसंद नहीं है क्योंकि यह आसानी से डेटा को जोड़ने की अनुमति नहीं देता है। यदि आपका प्रारंभिक बिंदु एक शब्दकोश है, तो आप पहले इसे एक डेटाफ्रेम में बदल सकते हैं और फिर इसे अपनी txt फाइल में जोड़ सकते हैं:

import pandas as pd
one_line_dict = exDict = {1:1, 2:2, 3:3}
df = pd.DataFrame.from_dict([one_line_dict])
df.to_csv('file.txt', header=False, index=True, mode='a')

मुझे उम्मीद है कि इससे मदद मिल सकती है।


1
एक साधारण कार्य के लिए बाहरी पुस्तकालय का उपयोग क्यों करें? पायथन सिंपल बेहतर सिद्धांत है।
रिकार्डो रिवाल्डो

बहुत उपयोगी नहीं है क्योंकि अधिकांश शब्दकोश जो मैं उपयोग करता हूं, वे उपयोगी डेटाफ़्रेम ऑब्जेक्ट बनने के लिए पर्याप्त सरल नहीं हैं।
pauljohn32

1
exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'w+') as file:
    file.write(str(exDict))


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