Programing

JSON 데이터를 파일에 어떻게 쓰나요?

lottogame 2020. 9. 28. 07:53
반응형

JSON 데이터를 파일에 어떻게 쓰나요?


변수에 JSON 데이터가 저장되어 있습니다 data.

매번 서버에서 데이터를 가져올 필요가 없도록 테스트를 위해 이것을 텍스트 파일에 작성하고 싶습니다.

현재 저는 이것을 시도하고 있습니다 :

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

그리고 오류가 발생합니다.

TypeError: must be string or buffer, not dict

이 문제를 해결하는 방법?


실제 JSON 부분을 잊었습니다. data사전이며 아직 JSON으로 인코딩되지 않았습니다. 최대 호환성을 위해 다음 과 같이 작성하십시오 (Python 2 및 3).

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

최신 시스템 (예 : Python 3 및 UTF-8 지원)에서는 다음을 사용하여 더 멋진 파일을 작성할 수 있습니다.

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

Python 2에 대해 허용되는 답변에서 ascii 인코딩이 아닌 utf8 인코딩 파일 을 얻으려면 다음을 사용하십시오.

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

코드는 Python 3에서 더 간단합니다.

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

Windows에서는 encoding='utf-8'인수 open가 여전히 필요합니다.

데이터의 인코딩 된 사본을 메모리에 저장하지 않고 (의 결과 dumps) Python 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호출은 Python 3에서는 중복되지만 Python 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 에서 제안한 대로 )를 추가하여 가독성을 더욱 향상시킵니다 . 이렇게하면 파일 크기가 약간 더 커지는 대신 json 파일에서 멋지게 들여 쓰기 된 정렬 구조를 얻을 수 있습니다.dumpdumps


나는 앞서 언급 한 답변으로 약간의 수정으로 대답 할 것이며 그것은 인간의 눈이 더 잘 읽을 수 있도록 미리 설정된 JSON 파일을 작성하는 것입니다. 이를 위해 4 개의 공백 문자 sort_keys로 as Trueindent함께 전달 하면 좋습니다. 또한 ASCII 코드가 JSON 파일에 작성되지 않도록주의하십시오.

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

Python 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 파일을 diff 도구와 비교하거나 버전 관리하에 두려는 경우에 유용합니다.
  • separators: Python이 후행 공백을 추가하지 않도록 방지하려면

패키지로

Have a look at my utility package mpu for a super simple and easy to remember one:

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

Created JSON file

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

Common file endings

.json

Alternatives

For your application, the following might be important:

  • Support by other programming languages
  • Reading / writing performance
  • Compactness (file size)

See also: Comparison of data serialization formats

In case you are rather looking for a way to make configuration files, you might want to read my short article Configuration files in Python


For those of you who are trying to dump greek or other "exotic" languages such as me but are also having problems (unicode errors) with weird characters such as the peace symbol (\u262E) or others which are often contained in json formated data such as Twitter's, the solution could be as follows (sort_keys is obviously optional):

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

I don't have enough reputation to add in comments, so I just write some of my findings of this annoying TypeError here:

Basically, I think it's a bug in the json.dump() function in Python 2 only - It can't dump a Python (dictionary / list) data containing non-ASCII characters, even you open the file with the encoding = 'utf-8' parameter. (i.e. No matter what you do). But, json.dumps() works on both Python 2 and 3.

To illustrate this, following up phihag's answer: the code in his answer breaks in Python 2 with exception TypeError: must be unicode, not str, if data contains non-ASCII characters. (Python 2.7.6, Debian):

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

It however works fine in Python 3.


Write a data in file using JSON use json.dump() or json.dumps() used. write like this to store data in file.

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

this example in list is store to a file.


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

To write the JSON with indentation, "pretty print":

import json

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

Also, if you need to debug improperly formatted JSON, and want a helpful error message, use import simplejson library, instead of import json (functions should be the same)


if you are trying to write a pandas dataframe into a file using a json format i'd recommend this

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

All previous answers are correct here is a very simple example:

#! /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()

enter image description here


The JSON data can be written to a file as follows

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]}]

Write to a file:

with open('text1.json', 'w') as f:
     json.dump(hist1, f)

The accepted answer is fine. However, I ran into "is not json serializable" error using that.

Here's how I fixed it with open("file-name.json", 'w') as output:

output.write(str(response))

Although it is not a good fix as the json file it creates will not have double quotes, however it is great if you are looking for quick and dirty.

참고URL : https://stackoverflow.com/questions/12309269/how-do-i-write-json-data-to-a-file

반응형