변수에 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)
답변
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
답변
나는 위에서 언급 한 답변으로 약간 수정하여 답변 할 것입니다. 즉 인간의 눈이 더 잘 읽을 수있는 사전 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)
답변
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 개의 공백을 사용하여 각 항목을 들여 씁니다 (예 : 새 dict가 시작될 때 (그렇지 않으면 모두 한 줄에 있음),sort_keys
: 사전의 키를 정렬합니다. 이것은 json 파일을 diff 도구와 비교하고 / 버전 관리하에 두려는 경우에 유용합니다.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
대안
- CSV : 매우 간단한 형식 ( 읽기 및 쓰기 )
- JSON : 사람이 읽을 수있는 데이터를 작성하는 데 적합합니다. 매우 일반적으로 사용됨 ( 읽기 및 쓰기 )
- YAML : YAML은 JSON의 상위 집합이지만 읽기 쉽습니다 ( 읽기 및 쓰기 , JSON 및 YAML 비교 )
- pickle : 파이썬 직렬화 형식 ( read & write )
- MessagePack ( Python 패키지 ) :보다 간결한 표현 ( 읽기 및 쓰기 )
- HDF5 ( Python 패키지 ) : 행렬에 적합 ( 읽기 및 쓰기 )
- XML : 존재합니다 * sigh * ( read & write )
응용 프로그램의 경우 다음이 중요 할 수 있습니다.
- 다른 프로그래밍 언어로 지원
- 읽기 / 쓰기 성능
- 소형화 (파일 크기)
참조 : 데이터 직렬화 형식 비교
구성 파일을 만드는 방법을 찾고 있다면 짧은 기사 구성 파일을 파이썬 으로 읽으십시오.
답변
그리스어 또는 나와 같은 다른 “이국적인”언어를 덤프하려고하지만 평화 기호 (\ 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))
답변
의견을 추가 할만 큼 평판이 충분하지 않으므로이 성가신 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에서는 잘 작동합니다.
답변
JSON 사용 json.dump () 또는 json.dumps ()를 사용 하여 파일에 데이터를 작성하십시오 . 파일에 데이터를 저장하려면 이와 같이 작성하십시오.
import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
json.dump(data, txtfile)
목록의이 예제는 파일에 저장됩니다.