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


1121

मेरे पास JSON डेटा वैरिएबल में संग्रहीत है data

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

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

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

और मुझे यह त्रुटि प्राप्त हो रही है:

TypeError: स्ट्रिंग या बफर होना चाहिए, तानाशाही नहीं

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

जवाबों:


2038

आप वास्तविक JSON भाग को भूल गए - dataएक शब्दकोश है और अभी तक JSON-एन्कोडेड नहीं है। अधिकतम संगतता के लिए इसे इस तरह लिखें (पायथन 2 और 3):

import json
with open('data.json', 'w') as f:
    json.dump(data, f)

एक आधुनिक प्रणाली (यानी पायथन 3 और यूटीएफ -8 समर्थन) पर, आप एक अच्छे फ़ाइल के साथ लिख सकते हैं

import json
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

8
यह धारावाहिक बनाने के लिए मददगार हो सकता है: stackoverflow.com/questions/4512982/…
jedierikb

12
क्या आपका मतलब json.dump या json.dumps है?
TerminalDilettante

153
@TerminalDilettante json.dumpकिसी फ़ाइल या फ़ाइल जैसी ऑब्जेक्ट पर लिखता है, जबकि json.dumpsएक स्ट्रिंग लौटाता है।
फ़िहाग

24
btw: डेटा का उपयोग फिर से पढ़ने के लिए: खुले ('data.txt') के साथ शिशु के रूप में: d = json.load (शिशु)। देखें: यह उत्तर
कलस

9
@denvar नहीं, यह उत्तर सूक्ष्मता से दिया गया है। पायथन 3 पर, json.dumpएक पाठ फ़ाइल पर लिखता है, न कि एक बाइनरी फ़ाइल। TypeErrorयदि फ़ाइल के साथ खोला गया था, तो आपको मिलेगा wb। पुराने पायथन संस्करणों पर, दोनों wनंद wbकाम करते हैं। एक स्पष्ट एन्कोडिंग आवश्यक नहीं है क्योंकि json.dumpडिफ़ॉल्ट रूप से एएससीआईआई- का आउटपुट है। यदि आप यह सुनिश्चित कर सकते हैं कि आपका कोड विरासत पायथन संस्करणों पर कभी नहीं चला है और आप और JSON फ़ाइल के हैंडलर गैर-ASCII डेटा को सही ढंग से संभाल सकते हैं, तो आप एक और सेट कर सकते हैं ensure_ascii=False
फ़िहाग

267

प्राप्त करने के लिए UTF8 -encoded के रूप में करने का विरोध किया फ़ाइल ascii -encoded अजगर 2 उपयोग के लिए स्वीकार किए जाते हैं जवाब में:

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- एन्कोडेड बाइटस्टार्स के उत्पादन से बचने के लिए, उपयोग करें:

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

codecs.getwriterकॉल अजगर 3 में अनावश्यक लेकिन अजगर 2 के लिए आवश्यक है


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

के उपयोग के ensure_ascii=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

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


5
unicodeज़रूरत से ज़्यादा है - का परिणाम json.dumpsपहले से ही एक यूनिकोड वस्तु है। ध्यान दें कि यह 3.x में विफल रहता है, जहां आउटपुट फ़ाइल मोड की यह पूरी गड़बड़ी साफ हो गई है, और json हमेशा चरित्र स्ट्रिंग्स (और चरित्र I / O) का उपयोग करता है और कभी बाइट्स नहीं करता है।
फिहग

4
2.x में type(json.dumps('a'))है <type 'str'>। यहां तक कि type(json.dumps('a', encoding='utf8'))है <type 'str'>
एंटनी हैचकिंस

4
हां, 3.x में json स्ट्रिंग्स का उपयोग करता है, फिर भी डिफ़ॉल्ट एन्कोडिंग ascii है। आपको यह स्पष्ट रूप से बताना होगा कि आप utf83.x में भी चाहते हैं । उत्तर अपडेट किया गया।
एंटनी हैचकिंस

4
ओह, तुम बिलकुल सही कह रहे हो - मुझे कुछ गड़बड़ लगी होगी। विस्तार के लिए +1।
फ़िहाग

1
पायथन 3.x उत्तर ने मेरे लिए काम किया भले ही मैं 2.7 का उपयोग कर रहा हूं। 2.x उत्तर ने एक त्रुटि लौटा दी 'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128):। तो जब संदेह में, 3.x उत्तर का उपयोग करें!
ब्लेयरगें

162

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

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

2
अभी भी हो रही हैUnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'
स्टीववे

1
@SirBenBenji सुनिश्चित करें कि आप जिस स्ट्रिंग का अनुसरण करने के लिए लिखने की कोशिश कर रहे हैं: str.decode ('utf-8')।
अम्बोदी

1
@SirBenBenji आप कोडेक्स का उपयोग करने का भी प्रयास कर सकते हैं, जैसा कि dinos66 नीचे निर्दिष्ट करता है
शिव

आपको # -*- coding: utf-8 -*-
शेबंग के

2
सॉर्ट_की और इंडेंट के लिए +1। @ एसाडे इस पंक्ति को जोड़ना अच्छा नहीं है क्योंकि यह इस धारणा को बनाएगा कि यह समाधान python2 के साथ ही काम करता है जो यह ( UnicodeEncodeErrorगैर-एएससीआई डेटा के साथ) नहीं करता है । देखें मेरी समाधान जानकारी के लिए।
एंटनी हैचकिंस

111

पाइथन 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:

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

एक पैकेज के साथ

mpuएक सुपर सरल और एक को याद करने में आसान के लिए मेरे उपयोगिता पैकेज को देखें:

import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)

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

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

आम फ़ाइल अंत

.json

वैकल्पिक

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

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

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

यदि आप विन्यास फाइल बनाने के लिए रास्ता ढूंढ रहे हैं, तो आप पायथन में मेरी संक्षिप्त लेख विन्यास फाइल पढ़ना चाहते हैं


2
ध्यान दें कि force_asciiध्वज Trueडिफ़ॉल्ट रूप से है। आपके जोंस फ़ाइल में "\u20ac"प्रत्येक के लिए अपठनीय 6-बाइट्स अनुक्रम होंगे (साथ ही साथ कोई अन्य गैर-असिस्की चरित्र)।
एंटनी हैचकिंस

आप openपढ़ने के लिए, लेकिन io.openलिखने के लिए क्यों इस्तेमाल करते हैं ? क्या यह पढ़ने के लिए भी उपयोग करना संभव है io.open? यदि हां, तो किन मापदंडों को पारित किया जाना चाहिए?
मीका झोल्टू

23

आप में से जो ग्रीक या अन्य "विदेशी" भाषाओं को मेरे जैसे डंप करने की कोशिश कर रहे हैं, लेकिन उन्हें अजीब अक्षरों (जैसे कि शांति प्रतीक (\ 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))

1
+1 जबकि डॉक्स python3 buildin openऔर assotiated io.openओवर की सिफारिश करते हैं codecs.open, इस मामले में यह एक अच्छा बैक -संगत-संगत हैक भी है। में को Python2 codecs.openअधिक "मांसभक्षी" io.open से है (यह दोनों str और यूनिकोड "खाने के लिए" कर सकते हैं, यदि आवश्यक हो परिवर्तित)। कोई यह कह सकता है कि यह codecs.openक्विक इनपुट में यूनिकोड स्ट्रिंग्स की उपस्थिति के आधार पर json.dumpsविभिन्न प्रकार की वस्तुओं ( str/ unicode) को उत्पन्न करने के क्वर्की के लिए क्षतिपूर्ति करता है।
एंटनी हैचकिंस

10

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

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

इसका वर्णन करने के लिए, फ़िहाग के उत्तर का पालन करें: उसके उत्तर में कोड अपवाद के साथ पायथन 2 में टूट जाता है TypeError: must be unicode, not str, यदि dataइसमें गैर-एएससीआईआई अक्षर हैं। (पायथन 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 में ठीक काम करता है।


जब आप कुछ गलत होने का दावा करते हैं तो कारण दें। @Nickname का उपयोग करें ताकि व्यक्ति अधिसूचित हो जाए। आप टिप्पणी नहीं लिख सकते, लेकिन आप टिप्पणी पढ़ सकते हैं। जैसा कि पहले टिप्पणी के जवाब में पहले ही कहा जा चुका है, कोशिश करें data = {'asdf': 1}। आपको TypeErrorअपने (दूसरे) संस्करण के साथ कुख्यात मिलेगा ।
एंटनी हैचकिंस

के बारे में ensure_ascii- यदि आप "वास्तविक" utf8 आउटपुट प्राप्त करना चाहते हैं तो यह आवश्यक है। इसके बिना आपके पास इस पत्र के साथ 2 बाइट्स प्रति वर्ण के विपरीत रूसी पत्र के साथ 6 बाइट्स के साथ सादा एससीआई होगा।
एंटनी हैचकिंस

@AntonyHatchkins आप unicode()भाग के लिए सही हैं । मुझे सिर्फ ioपायथन 2, write()जरूरतों unicode, नहीं में पैकेज के लिए एहसास हुआ str
इबिक

1
यह कोड मेरे लिए भी python2.6.6, डेबियन (10 दिसंबर 2010) के साथ काम करता है। साथ ही python2.7.9 या python3 के साथ। इसे एक बार फिर से जांचें, plz।
एंटनी हैचकिंस

7

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

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

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


यह समान है लेकिन उदाहरण के साथ प्रदान करें
विशाल गदिया

5

इंडेंटेशन के साथ JSON लिखने के लिए, "सुंदर प्रिंट":

import json

outfile = open('data.json')
json.dump(data, outfile, indent=4)

इसके अलावा, यदि आपको अनुचित रूप से प्रारूपित JSON को डिबग करने की आवश्यकता है, और एक उपयोगी त्रुटि संदेश चाहते हैं, तो import simplejsonलाइब्रेरी का उपयोग करें , इसके बजाय import json(फ़ंक्शन समान होना चाहिए)


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

2
यह @ phihag के उत्तर के समान काम करता है, लेकिन हर समय काम करने की गारंटी नहीं है। इस तरह के कोड पर विचार करें: f = open('1.txt', 'w'); f.write('a'); input()। इसे चलाएं और फिर इसे SYGTERM करें ( Ctrl-Zफिर विंडोज kill %1पर लिनक्स Ctrl-Breakपर)। 1.txt0 बाइट होगा। इसका कारण यह है कि लेखन बफ़र हो गया था और फ़ाइल उस समय बंद नहीं थी जब SYGTERM हुई थी। withब्लॉक गारंटी देता है कि फ़ाइल हमेशा 'ट्राइ / अंत में' ब्लॉक की तरह बंद हो जाती है, लेकिन छोटी होती है।
एंटनी हैचकिंस

3

JSON को एक फ़ाइल में लिखना

import json

data = {}
data['people'] = []
data['people'].append({
    'name': 'Scott',
    'website': 'stackabuse.com',
    'from': 'Nebraska'
})
data['people'].append({
    'name': 'Larry',
    'website': 'google.com',
    'from': 'Michigan'
})
data['people'].append({
    'name': 'Tim',
    'website': 'apple.com',
    'from': 'Alabama'
})

with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

फ़ाइल से JSON पढ़ना

import json

with open('data.txt') as json_file:
    data = json.load(json_file)
    for p in data['people']:
        print('Name: ' + p['name'])
        print('Website: ' + p['website'])
        print('From: ' + p['from'])
        print('')

ढेर अतिप्रवाह में आपका स्वागत है। यदि आप एक पुराने प्रश्न का उत्तर देने का निर्णय लेते हैं, जो अच्छी तरह से स्थापित और सही उत्तर देता है, तो दिन में देर से एक नया उत्तर जोड़ने से आपको कोई क्रेडिट नहीं मिल सकता है। यदि आपके पास कुछ विशिष्ट नई जानकारी है, या आप आश्वस्त हैं कि अन्य उत्तर सभी गलत हैं, तो सभी तरीकों से एक नया उत्तर जोड़ सकते हैं, लेकिन 'अभी तक एक और उत्तर' एक ही मूल जानकारी देने के बाद प्रश्न पूछे जाने पर लंबे समय तक जीता है ' टी आप बहुत क्रेडिट कमाते हैं। (आप कुछ नमूना डेटा दिखाते हैं; यह अच्छा है, लेकिन मुझे यकीन नहीं है कि यह पर्याप्त है, विशेष रूप से जब आप नमूना डेटा के लिए निर्मित नहीं दिखाते हैं।)
जोनाथन लेफ़लर

मार्गदर्शन के लिए ठीक है धन्यवाद
iman

2

यदि आप एक फ़ाइल में एक पैंडस डेटाफ्रेम लिखने की कोशिश कर रहे हैं, तो एक json प्रारूप का उपयोग करके मैं इसे सुझाऊंगा

destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()

2

पिछले सभी उत्तर सही हैं यहां एक बहुत ही सरल उदाहरण है:

#! /usr/bin/env python
import json

def write_json():
    # create a dictionary  
    student_data = {"students":[]}
    #create a list
    data_holder = student_data["students"]
    # just a counter
    counter = 0
    #loop through if you have multiple items..         
    while counter < 3:
        data_holder.append({'id':counter})
        data_holder.append({'room':counter})
        counter += 1    
    #write the file        
    file_path='/tmp/student_data.json'
    with open(file_path, 'w') as outfile:
        print("writing file to: ",file_path)
        # HERE IS WHERE THE MAGIC HAPPENS 
        json.dump(student_data, outfile)
    outfile.close()     
    print("done")

write_json()

यहां छवि विवरण दर्ज करें


1

स्वीकृत उत्तर ठीक है। हालाँकि, मैं "का उपयोग नहीं कर रहा हूँ" क्रमिक "त्रुटि है कि का उपयोग कर।

यहां बताया गया है कि मैंने इसे open("file-name.json", 'w')आउटपुट के रूप में कैसे तय किया :

output.write(str(response))

हालाँकि यह एक अच्छा फिक्स नहीं है क्योंकि इसे बनाने वाली json फाइल में दोहरे कोट्स नहीं होंगे, हालाँकि यह बहुत अच्छा है अगर आप जल्दी और गंदे दिख रहे हैं।


0

JSON डेटा एक फ़ाइल में निम्नानुसार लिखा जा सकता है

hist1 = [{'val_loss': [0.5139984398465246],
'val_acc': [0.8002029867684085],
'loss': [0.593220705309384],
'acc': [0.7687131817929321]},
{'val_loss': [0.46456472964199463],
'val_acc': [0.8173602046780344],
'loss': [0.4932038113037539],
'acc': [0.8063946213802453]}]

एक फ़ाइल में लिखें:

with open('text1.json', 'w') as f:
     json.dump(hist1, f)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.