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 파일에서 멋지게 들여 쓰기 된 정렬 구조를 얻을 수 있습니다.dump
dumps
나는 앞서 언급 한 답변으로 약간의 수정으로 대답 할 것이며 그것은 인간의 눈이 더 잘 읽을 수 있도록 미리 설정된 JSON 파일을 작성하는 것입니다. 이를 위해 4 개의 공백 문자 sort_keys
로 as True
및 indent
함께 전달 하면 좋습니다. 또한 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
- CSV: Super simple format (read & write)
- JSON: Nice for writing human-readable data; VERY commonly used (read & write)
- YAML: YAML is a superset of JSON, but easier to read (read & write, comparison of JSON and YAML)
- pickle: A Python serialization format (read & write)
- MessagePack (Python package): More compact representation (read & write)
- HDF5 (Python package): Nice for matrices (read & write)
- XML: exists too *sigh* (read & write)
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()
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
'Programing' 카테고리의 다른 글
여러 PDF 파일을 하나의 PDF로 병합 / 변환 (0) | 2020.09.28 |
---|---|
클릭 가능한 라벨이있는 체크 박스를 만드는 방법은 무엇입니까? (0) | 2020.09.28 |
JavaScript에서 네임 스페이스를 어떻게 선언합니까? (0) | 2020.09.28 |
iOS에서 상태 표시 줄 텍스트 색상을 변경하는 방법 (0) | 2020.09.28 |
에뮬레이터는 어떻게 작동하며 어떻게 작성됩니까? (0) | 2020.09.28 |