변수에 JSON 데이터가 저장되어 있습니다 data
.
테스트를 위해 텍스트 파일에 이것을 쓰고 싶을 때마다 서버에서 데이터를 가져올 필요가 없습니다.
현재, 나는 이것을 시도하고있다 :
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
그리고이 오류가 발생합니다.
TypeError : dict가 아닌 문자열 또는 버퍼 여야합니다.
이 문제를 해결하는 방법?
변수에 JSON 데이터가 저장되어 있습니다 data
.
테스트를 위해 텍스트 파일에 이것을 쓰고 싶을 때마다 서버에서 데이터를 가져올 필요가 없습니다.
현재, 나는 이것을 시도하고있다 :
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
그리고이 오류가 발생합니다.
TypeError : 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)
json.dump
는 파일 또는 파일과 유사한 객체에 쓰는 반면 json.dumps
문자열을 반환합니다.
json.dump
이진 파일이 아닌 텍스트 파일에 씁니다. 로 TypeError
파일을 열면가 나타납니다 wb
. 이전의 파이썬 버전에서 모두 w
낸드 wb
작동합니다. 출력은 json.dump
기본적으로 ASCII 전용 이므로 명시적인 인코딩이 필요하지 않습니다 . 레거시 Python 버전에서 코드가 실행되지 않고 JSON 파일의 핸들러가 비 ASCII 데이터를 올바르게 처리 할 수있는 경우 하나를 지정하고을 설정할 수 있습니다 ensure_ascii=False
.
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
) 파이썬 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
unicode
불필요 -의 결과가 json.dumps
이미 유니 코드 개체입니다. 이것은 출력 파일 모드의 전체 혼란이 정리 된 3.x에서 실패하며 json은 항상 문자열 (및 문자 I / O)을 사용하며 바이트는 사용하지 않습니다.
type(json.dumps('a'))
입니다 <type 'str'>
. 심지어 type(json.dumps('a', encoding='utf8'))
입니다 <type 'str'>
.
utf8
3.x에서도 원하는 것을 명시 적으로 알려 주어야합니다. 답변을 업데이트했습니다.
'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128)
. 의심스러운 경우 3.x 답변을 사용하십시오!
나는 위에서 언급 한 답변으로 약간 수정하여 답변 할 것입니다. 즉 인간의 눈이 더 잘 읽을 수있는 사전 JSON 파일을 작성하는 것입니다. 이를 위해 통과 sort_keys
로 True
및 indent
4 개 개의 공백 문자로 당신은 갈 수 있습니다. 또한 ASCII 코드가 JSON 파일에 작성되지 않도록주의하십시오.
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'
# -*- coding: utf-8 -*-
shebang
UnicodeEncodeError
비 ASCII 데이터 에서는 작동하지 않습니다 . 자세한 내용은 내 솔루션 을 참조하십시오.
# -*- 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 개의 공백을 사용하여 각 항목을 들여 씁니다 (예 : 새 dict가 시작될 때 (그렇지 않으면 모두 한 줄에 있음),sort_keys
: 사전의 키를 정렬합니다. 이것은 json 파일을 diff 도구와 비교하고 / 버전 관리하에 두려는 경우에 유용합니다.separators
: 파이썬이 후행 공백을 추가하지 못하게하려면mpu
매우 간단하고 기억하기 쉬운 유틸리티 패키지 를 살펴보십시오 .
import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)
{
"a list":[
1,
42,
3.141,
1337,
"help",
"€"
],
"a string":"bla",
"another dict":{
"foo":"bar",
"key":"value",
"the answer":42
}
}
.json
응용 프로그램의 경우 다음이 중요 할 수 있습니다.
참조 : 데이터 직렬화 형식 비교
구성 파일을 만드는 방법을 찾고 있다면 짧은 기사 구성 파일을 파이썬 으로 읽으십시오.
force_ascii
플래그가 True
기본적으로. json 파일 및 ASCII 이외의 다른 문자 "\u20ac"
각각 €
에 대해 읽을 수없는 6 바이트 시퀀스 가 있습니다.
open
책 io.open
을 쓰는데 쓰는데 쓰는가? 그것은이다 가능한 사용 io.open
뿐만 아니라 읽는? 그렇다면 어떤 매개 변수를 전달해야합니까?
그리스어 또는 나와 같은 다른 "이국적인"언어를 덤프하려고하지만 평화 기호 (\ u262E)와 같은 이상한 문자 또는 json 형식의 데이터에 포함되는 다른 문자에 문제 (유니 코드 오류)가있는 사용자 트위터와 같은 해결책은 다음과 같습니다 (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))
open
및 협의 io.open
를 권장하지만 codecs.open
이 경우에도 이전 버전과 호환되는 훌륭한 해킹입니다. python2에서 codecs.open
io.open보다 "잡식성"입니다 (필요하다면 str과 유니 코드를 모두 "먹을"수 있습니다). 이 codecs.open
쿼크 는 입력에 유니 코드 문자열의 존재에 따라 json.dumps
다른 유형의 객체 ( str
/ unicode
) 를 생성하는 쿼크를 보완 한다고 말할 수 있습니다 .
의견을 추가 할만 큼 평판이 충분하지 않으므로이 성가신 TypeError에 대한 결과를 여기에 작성하십시오.
기본적으로 json.dump()
파이썬 2 의 함수 에서만 버그라고 생각합니다 .ASCII가 아닌 문자가 포함 된 파이썬 (사전 / 목록) 데이터를 덤프 할 수 없으며 매개 변수로 파일을 열 더라도 마찬가지encoding = 'utf-8'
입니다. (즉, 무엇을 하든지). 그러나 json.dumps()
Python 2와 3 모두 에서 작동합니다.
이것을 설명하기 위해 phihag의 답변을 따르십시오 . 비 ASCII 문자가 포함되어 TypeError: must be unicode, not str
있으면 Python 2에서 그의 답변 코드가 예외로 중단됩니다 data
. (Python 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에서는 잘 작동합니다.
data = {'asdf': 1}
. TypeError
(두 번째) 변형으로 악명 이 높아집니다.
ensure_ascii
- 당신이 "진짜"UTF8 출력을 얻으려면 필요가있다. 그것 없이는이 플래그를 사용하여 문자 당 2 바이트가 아닌 러시아 문자 당 6 바이트의 일반 ASCII가 있습니다.
unicode()
부분에 맞습니다 . 난 그냥 실현 io
, 파이썬 2에서 패키지 write()
가 필요 unicode
하지 str
.
JSON 사용 json.dump () 또는 json.dumps ()를 사용 하여 파일에 데이터를 작성하십시오 . 파일에 데이터를 저장하려면 이와 같이 작성하십시오.
import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
json.dump(data, txtfile)
목록의이 예제는 파일에 저장됩니다.
들여 쓰기로 JSON을 작성하려면 "pretty print":
import json
outfile = open('data.json')
json.dump(data, outfile, indent=4)
또한 형식이 잘못된 JSON을 디버깅해야하고 유용한 오류 메시지가 필요한 경우 import simplejson
대신 라이브러리를 사용하십시오 import json
(함수는 동일해야 함).
json.dump(data, open('data.txt', 'wb'))
f = open('1.txt', 'w'); f.write('a'); input()
. 그것을 실행하고 (그것을 SYGTERM Ctrl-Z
다음 kill %1
, 리눅스에 Ctrl-Break
윈도우에서). 1.txt
0 바이트를 갖습니다. SYGTERM이 발생한 순간에 쓰기가 버퍼링되고 파일이 플러시되지 않았기 때문입니다. with
블록은 파일이 'try / finally'블록처럼 항상 짧아 지도록 항상 닫힙니다.
파일에 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('')
json 형식을 사용하여 팬더 데이터 프레임을 파일에 쓰려고하면 이것을 권장합니다.
destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()
이전의 모든 대답은 정확합니다. 매우 간단한 예입니다.
#! /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()
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)