python मैं एक फ़ाइल में JSON डेटा कैसे लिखूं?




(8)

मेरे पास चर data में संग्रहीत JSON data

मैं परीक्षण के लिए इसे एक टेक्स्ट फ़ाइल में लिखना चाहता हूं इसलिए मुझे प्रत्येक बार सर्वर से डेटा को पकड़ना नहीं है।

वर्तमान में, मैं यह कोशिश कर रहा हूं:

obj = open('data.txt', 'wb')
obj.write(data)
obj.close

और त्रुटि प्राप्त हो रही है:

TypeError: must be string or buffer, not dict

इसे कैसे ठीक करें?


Python 2 के स्वीकृत उत्तर में ascii -encoded के विपरीत utf8 -encoded फ़ाइल प्राप्त करने के लिए:

import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
  f.write(json.dumps(data, ensure_ascii=False))

पाइथन 3 में कोड सरल है:

import json
with open('data.txt', 'w') as f:
  json.dump(data, f, ensure_ascii=False)

विंडोज़ पर, encoding='utf-8' तर्क open लिए अभी भी जरूरी है।

स्मृति में डेटा की एक एन्कोडेड प्रति संग्रह ( dumps परिणाम) को संग्रहीत करने के लिए और पायथन 2 और 3 दोनों में utf8-encoded bytestrings आउटपुट करने के लिए, उपयोग करें:

import json, codecs
with open('data.txt', 'wb') as f:
    json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)

codecs.getwriter . codecs.getwriter कॉल पायथन 3 में अनावश्यक है लेकिन पाइथन 2 के लिए आवश्यक है

पठनीयता और आकार:

ensure_acsii=False का उपयोग बेहतर पठनीयता और छोटे आकार देता है:

>>> json.dumps({'price': '€10'})
'{"price": "\\u20ac10"}'
>>> json.dumps({'price': '€10'}, ensure_ascii=False)
'{"price": "€10"}'

>>> len(json.dumps({'абвгд': 1}))
37
>>> len(json.dumps({'абвгд': 1}, ensure_ascii=False).encode('utf8'))
17

dump या dump तर्कों के लिए झंडे indent=4, sort_keys=True (जैसा कि dinos66 द्वारा सुझाया गया है) जोड़कर पठनीयता में सुधार करें। इस तरह आप थोड़ी बड़ी फ़ाइल आकार की लागत पर जेसन फ़ाइल में एक अच्छी तरह से इंडेंटेड सॉर्टेड संरचना प्राप्त करेंगे।


json.dump(data, open('data.txt', 'wb'))

पाइथन 3 में फ़ाइल को पढ़ने और लिखने के लिए यहां एक उपयोगी संरचना है।

from json import dump, load
from time import sleep
from random import random

def json_file(path, data = None, delay = 0.1):
    while True:
        try:
            if data == None:
                with open(path, "r", encoding = "utf-8") as f:
                    return load(f)
            else:
                with open(path, "w", encoding = "utf-8") as f:
                    return dump(data, f)
        except:
            sleep(random()*delay) # concurrency

पायथन 2 + 3 के साथ JSON फ़ाइलों को पढ़ें और लिखें; यूनिकोड के साथ काम करता है

# -*- coding: utf-8 -*-
import json

# Make it work for Python 2+3 and with Unicode
import io
try:
    to_unicode = unicode
except NameError:
    to_unicode = str

# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
        'a string': 'bla',
        'another dict': {'foo': 'bar',
                         'key': 'value',
                         'the answer': 42}}

# Write JSON file
with io.open('data.json', 'w', encoding='utf8') as outfile:
    str_ = json.dumps(data,
                      indent=4, sort_keys=True,
                      separators=(',', ': '), ensure_ascii=False)
    outfile.write(to_unicode(str_))

# Read JSON file
with open('data.json') as data_file:
    data_loaded = json.load(data_file)

print(data == data_loaded)

json.dump के पैरामीटर का json.dump :

  • indent : प्रत्येक प्रविष्टि को इंडेंट करने के लिए 4 रिक्त स्थान का उपयोग करें, उदाहरण के लिए जब कोई नया नियम शुरू होता है (अन्यथा सभी एक पंक्ति में होंगे)
  • sort_keys : शब्दकोशों की चाबियाँ क्रमबद्ध करें। यह उपयोगी है अगर आप एक अलग उपकरण के साथ जेसन फाइलों की तुलना करना चाहते हैं / उन्हें संस्करण नियंत्रण में डाल दें।
  • separators : पाइथन को पिछली सफेद जगहों को जोड़ने से रोकने के लिए

JSON फ़ाइल बनाई गई

{
    "a list":[
        1,
        42,
        3.141,
        1337,
        "help",
        "€"
    ],
    "a string":"bla",
    "another dict":{
        "foo":"bar",
        "key":"value",
        "the answer":42
    }
}

सामान्य फ़ाइल अंत

.json

वैकल्पिक

  • सीएसवी: सुपर सरल प्रारूप ( पढ़ें और लिखें )
  • JSON: मानव-पठनीय डेटा लिखने के लिए अच्छा; बहुत सामान्य रूप से उपयोग किया जाता है ( पढ़ें और लिखें )
  • वाईएएमएल: वाईएएमएल जेएसओएन का एक सुपरसेट है, लेकिन पढ़ने में आसान है ( पढ़ें और लिखें , जेएसओएन और वाईएएमएल की तुलना )
  • अचार: एक पायथन क्रमबद्धता प्रारूप ( पढ़ें और लिखें )
  • MessagePack ( पायथन पैकेज ): अधिक कॉम्पैक्ट प्रतिनिधित्व ( पढ़ें और लिखें )
  • HDF5 ( पायथन पैकेज ): HDF5 लिए अच्छा ( पढ़ें और लिखें )
  • एक्सएमएल: भी मौजूद है * श्वास * ( read और write )

आपके आवेदन के लिए, निम्नलिखित महत्वपूर्ण हो सकते हैं:

  • अन्य प्रोग्रामिंग भाषाओं द्वारा समर्थन
  • प्रदर्शन पढ़ना / लिखना
  • कॉम्पैक्टनेस (फ़ाइल का आकार)

यह भी देखें: डेटा क्रमिकरण प्रारूपों की तुलना

यदि आप कॉन्फ़िगरेशन फ़ाइलों को बनाने का कोई तरीका ढूंढ रहे हैं, तो आप पाइथन में अपने लघु आलेख कॉन्फ़िगरेशन फ़ाइलों को पढ़ना चाहेंगे


मेरे पास टिप्पणियों में जोड़ने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं यहां इस कष्टप्रद TypeError के कुछ निष्कर्षों को लिखता हूं:

असल में, मुझे लगता है कि यह केवल Python 2 में json.dump() फ़ंक्शन में एक बग है - यह गैर-ASCII वर्ण वाले पायथन (शब्दकोश / सूची) डेटा को डंप नहीं कर सकता है, यहां तक ​​कि आप फ़ाइल को encoding = 'utf-8' साथ खोलते हैं encoding = 'utf-8' पैरामीटर। (यानी कोई फर्क नहीं पड़ता कि आप क्या करते हैं)। लेकिन, json.dumps() दोनों पायथन 2 और 3 पर काम करता है।

इसे चित्रित करने के लिए, फिहाग के उत्तर का पालन करें: उसके उत्तर में कोड पायथन 2 में अपवाद के साथ टूट जाता है TypeError: must be unicode, not str यदि data में गैर-ASCII वर्ण होते हैं तो स्ट्रिक TypeError: must be unicode, not str । (पायथन 2.7.6, डेबियन):

import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'абвгд': 1}
with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

हालांकि यह पायथन 3 में ठीक काम करता है।


JSON उपयोग json.dump () या json.dumps () का उपयोग कर फ़ाइल में डेटा लिखें। फ़ाइल में डेटा स्टोर करने के लिए इस तरह लिखें।

import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
    json.dump(data, txtfile)

सूची में यह उदाहरण एक फ़ाइल में स्टोर है।


आप में से उन लोगों के लिए जो ग्रीक या अन्य "विदेशी" भाषाओं को डंप करने की कोशिश कर रहे हैं, लेकिन शांति प्रतीक (\ u262E) या अन्य जैसे अजीब पात्रों के साथ समस्याएं भी हैं (यूनिकोड त्रुटियां) जो अक्सर जेसन फॉर्मेटेड डेटा में निहित होती हैं जैसे कि ट्विटर, समाधान निम्नानुसार हो सकता है (sort_keys स्पष्ट रूप से वैकल्पिक है):

import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
     f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))

मैं उपरोक्त उत्तरों के साथ मामूली संशोधन के साथ जवाब दूंगा और यह एक सुंदर जेएसओएन फाइल लिखना है जो मानव आंखें बेहतर पढ़ सकती हैं। इसके लिए, sort_keys को 4 स्पेस वर्णों के साथ True और indent रूप में पास करें और आप जाने के लिए अच्छे हैं। यह भी सुनिश्चित करने का ख्याल रखें कि आपके JSON फ़ाइल में एएससीआई कोड नहीं लिखे जाएंगे:

with open('data.txt', 'w') as outfile:
     json.dump(jsonData, outfile, sort_keys = True, indent = 4,
               ensure_ascii = False)






json