JSON 데이터를 파일에 작성하는 방법


1122

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

테스트를 위해 텍스트 파일에 이것을 쓰고 싶을 때마다 서버에서 데이터를 가져올 필요가 없습니다.

현재, 나는 이것을 시도하고있다 :

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

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

TypeError : dict가 아닌 문자열 또는 버퍼 여야합니다.

이 문제를 해결하는 방법?

답변:


2040

실제 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)

8
이것은 serialize에 도움이 될 수 있습니다. stackoverflow.com/questions/4512982/…
jedierikb

12
json.dump 또는 json.dumps을 의미합니까?
TerminalDilettante

153
@TerminalDilettante json.dump는 파일 또는 파일과 유사한 객체에 쓰는 반면 json.dumps문자열을 반환합니다.
phihag

24
btw : 데이터를 다시 읽으려면 open ( 'data.txt')을 infile로 사용하십시오 : d = json.load (infile). 참조 : 이 답변
klaas

9
@ denvar 아니요,이 답변은 잘 조정되었습니다. Python 3에서는 json.dump이진 파일이 아닌 텍스트 파일에 씁니다. 로 TypeError파일을 열면가 나타납니다 wb. 이전의 파이썬 버전에서 모두 w낸드 wb작동합니다. 출력은 json.dump기본적으로 ASCII 전용 이므로 명시적인 인코딩이 필요하지 않습니다 . 레거시 Python 버전에서 코드가 실행되지 않고 JSON 파일의 핸들러가 비 ASCII 데이터를 올바르게 처리 할 수있는 경우 하나를 지정하고을 설정할 수 있습니다 ensure_ascii=False.
phihag

267

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 파일에 잘 들여 쓰기 된 정렬 구조를 얻을 수 있습니다.dumpdumps


5
unicode불필요 -의 결과가 json.dumps이미 유니 코드 개체입니다. 이것은 출력 파일 모드의 전체 혼란이 정리 된 3.x에서 실패하며 json은 항상 문자열 (및 문자 I / O)을 사용하며 바이트는 사용하지 않습니다.
phihag

4
2.x에서는 type(json.dumps('a'))입니다 <type 'str'>. 심지어 type(json.dumps('a', encoding='utf8'))입니다 <type 'str'>.
Antony Hatchkins 11:14에

4
예, 3.x에서 json은 문자열을 사용하지만 기본 인코딩은 ascii입니다. utf83.x에서도 원하는 것을 명시 적으로 알려 주어야합니다. 답변을 업데이트했습니다.
Antony Hatchkins

4
오, 당신 말이 맞아요 세부 사항은 +1입니다.
phihag

1
Python 3.x 답변은 2.7을 사용하고 있지만 저에게 효과적이었습니다. 2.x 답변에서 오류를 반환했습니다 : 'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128). 의심스러운 경우 3.x 답변을 사용하십시오!
Blairg23

162

나는 위에서 언급 한 답변으로 약간 수정하여 답변 할 것입니다. 즉 인간의 눈이 더 잘 읽을 수있는 사전 JSON 파일을 작성하는 것입니다. 이를 위해 통과 sort_keysTrueindent4 개 개의 공백 문자로 당신은 갈 수 있습니다. 또한 ASCII 코드가 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'
stevek

1
@SirBenBenji 작성하려고하는 문자열을 확인하십시오 : str.decode ( 'utf-8').
ambodi

1
@SirBenBenji dinos66에서 다음과 같이 코덱을 사용해 볼 수도 있습니다
Shiv

또한 # -*- coding: utf-8 -*-shebang
aesede

2
sort_keys 및 들여 쓰기의 경우 +1 @aesede이 솔루션을 추가하는 것은 좋지 않습니다.이 솔루션은 python2에서도 작동하지만 UnicodeEncodeError비 ASCII 데이터 에서는 작동하지 않습니다 . 자세한 내용은 내 솔루션 을 참조하십시오.
Antony Hatchkins

111

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

대안

응용 프로그램의 경우 다음이 중요 할 수 있습니다.

  • 다른 프로그래밍 언어로 지원
  • 읽기 / 쓰기 성능
  • 소형화 (파일 크기)

참조 : 데이터 직렬화 형식 비교

구성 파일을 만드는 방법을 찾고 있다면 짧은 기사 구성 파일을 파이썬 으로 읽으십시오.


2
그 주 force_ascii플래그가 True기본적으로. json 파일 및 ASCII 이외의 다른 문자 "\u20ac"각각 에 대해 읽을 수없는 6 바이트 시퀀스 가 있습니다.
Antony Hatchkins

openio.open을 쓰는데 쓰는데 쓰는가? 그것은이다 가능한 사용 io.open뿐만 아니라 읽는? 그렇다면 어떤 매개 변수를 전달해야합니까?
Micah Zoltu

23

그리스어 또는 나와 같은 다른 "이국적인"언어를 덤프하려고하지만 평화 기호 (\ 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))

1
+1 docs는 python3 내장 open및 협의 io.open를 권장하지만 codecs.open이 경우에도 이전 버전과 호환되는 훌륭한 해킹입니다. python2에서 codecs.openio.open보다 "잡식성"입니다 (필요하다면 str과 유니 코드를 모두 "먹을"수 있습니다). 이 codecs.open쿼크 는 입력에 유니 코드 문자열의 존재에 따라 json.dumps다른 유형의 객체 ( str/ unicode) 를 생성하는 쿼크를 보완 한다고 말할 수 있습니다 .
Antony Hatchkins

10

의견을 추가 할만 큼 평판이 충분하지 않으므로이 성가신 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에서는 잘 작동합니다.


무언가 잘못되었다고 주장하는 이유를 설명하십시오. 사람에게 알림을 받으려면 @nickname을 사용하십시오. 주석은 쓸 수 없지만 주석은 읽을 수 있습니다. 첫 번째 의견에 대한 답변에서 이미 언급했듯이을 시도하십시오 data = {'asdf': 1}. TypeError(두 번째) 변형으로 악명 이 높아집니다.
Antony Hatchkins

에 관하여 ensure_ascii- 당신이 "진짜"UTF8 출력을 얻으려면 필요가있다. 그것 없이는이 플래그를 사용하여 문자 당 2 바이트가 아닌 러시아 문자 당 6 바이트의 일반 ASCII가 있습니다.
Antony Hatchkins

@AntonyHatchkins 당신은 그 unicode()부분에 맞습니다 . 난 그냥 실현 io, 파이썬 2에서 패키지 write()가 필요 unicode하지 str.
ibic

1
이 코드는 python2.6.6, Debian (2010 년 12 월 10 일)에서도 작동합니다. python2.7.9 또는 python3과 함께. 다시 한번 확인 해봐, PLZ
Antony Hatchkins 2012

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)

목록의이 예제는 파일에 저장됩니다.


비슷하지만 예제를 제공합니다
Vishal Gediya

5

들여 쓰기로 JSON을 작성하려면 "pretty print":

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블록은 파일이 'try / finally'블록처럼 항상 짧아 지도록 항상 닫힙니다.
Antony Hatchkins

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('')

스택 오버플로에 오신 것을 환영합니다. 잘 정립되고 정답이있는 오래된 질문에 대답하기로 결정한 경우, 늦은 시간에 새 답변을 추가하면 크레딧을 얻지 못할 수 있습니다. 독특한 새로운 정보가 있거나 다른 답변이 모두 잘못되었다고 확신하는 경우 반드시 새로운 답변을 추가하되, 질문이 일반적으로 제기 된 후 오랫동안 동일한 기본 정보를 제공하는 '아직 다른 답변'을 작성하십시오. ' 당신은 많은 신용을 얻습니다. (일부 샘플 데이터를 보여 주면 좋지만, 특히 샘플 데이터를 위해 생성 된 것을 보여주지 않기에 충분하지는 않습니다.)
Jonathan Leffler

지도 해 주셔서 감사합니다
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

받아 들여진 대답은 괜찮습니다. 그러나 그것을 사용하여 "json serializable이 아닙니다"오류가 발생했습니다.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.