etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2022. 7. 6. 02:43
반응형

질문자 :user1530318


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

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

현재 나는 이것을 시도하고 있습니다.

 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)

phihag

utf8 인코딩을 받으려면


Community Wiki

앞서 언급한 답변으로 약간 수정하여 답변하겠습니다. 즉, 사람의 눈이 더 잘 읽을 수 있는 예쁜 JSON 파일을 작성하는 것입니다. 이를 위해 sort_keysTrue 로 전달하고 4개의 공백 문자로 indent 또한 ASCII 코드가 JSON 파일에 작성되지 않도록 주의하십시오.

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

ambodi

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이 후행 공백을 추가하지 못하도록 방지

패키지로

매우 간단하고 기억하기 쉬운 유틸리티 패키지 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

대안

애플리케이션의 경우 다음이 중요할 수 있습니다.

  • 다른 프로그래밍 언어 지원
  • 읽기/쓰기 성능
  • 컴팩트함(파일 크기)

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

구성 파일을 만드는 방법을 찾고 있는 경우 내 짧은 기사 Python의 구성 파일을 읽을 수 있습니다.


Martin Thoma

저와 같은 그리스어 또는 기타 "이국적인" 언어를 버리려고 하지만 json 형식 데이터에 자주 포함되는 평화 기호(\u262E) 또는 기타 문자와 같은 이상한 문자로 인해 문제(유니코드 오류)가 발생하는 분들을 위해 Twitter와 같은 솔루션은 다음과 같을 수 있습니다(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))

dinos66

파일에 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('')

iman

나는 코멘트에 추가할 평판이 충분하지 않으므로 이 성가신 TypeError에 대한 내 발견 사항 중 일부를 여기에 씁니다.

기본적으로 Python 2 json.dump() 함수의 버그라고 생각합니다 encoding = 'utf-8' 파일을 열 더라도 ASCII가 아닌 문자가 포함된 Python(사전/목록) 데이터를 덤프할 수 없습니다. encoding = 'utf-8' 매개변수. (즉, 당신이 무엇을 하든지 상관없이). 그러나 json.dumps() 는 Python 2와 3 모두에서 작동합니다.

이를 설명하기 위해 phihag의 답변을 따르십시오. data 에 ASCII가 아닌 문자가 포함된 경우 TypeError: must be unicode, not str (파이썬 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)

그러나 Python 3에서는 잘 작동합니다.


ibic

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

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

Alexander

들여쓰기가 있는 JSON을 작성하려면 "pretty print":

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

또한 형식이 잘못된 JSON을 디버그해야 하고 유용한 오류 메시지가 필요한 경우 import json import simplejson 라이브러리를 사용하십시오(함수는 동일해야 함).


James Wierzba

이전의 모든 답변이 정확합니다. 매우 간단한 예입니다.

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

여기에 이미지 설명 입력


grepit

json 형식을 사용하여 pandas 데이터 프레임을 파일에 쓰려는 경우 이것을 권장합니다.

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

Franco Miguel Contreras

수락 된 답변은 괜찮습니다. 그러나 그것을 사용하여 "JSON 직렬화 불가능" 오류가 발생했습니다.

다음 open("file-name.json", 'w') 하여 수정한 방법입니다.

output.write(str(response))

생성하는 json 파일에 큰 따옴표가 없기 때문에 좋은 수정은 아니지만 빠르고 더러운 것을 찾고 있다면 좋습니다.


Akshat Bajaj

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)

Ashok Kumar Jayaraman

사전에 NumPy 데이터 유형이 있는 경우 json.dumps() 에 추가 매개변수가 필요하고 크레딧은 TypeError: Object of type 'ndarray' is not JSON serializable TypeError: Object of type int64 is not JSON serializable 와 같은 오류도 수정합니다. TypeError: Object of type int64 is not JSON serializable :

 class NumpyEncoder(json.JSONEncoder): """ Special json encoder for np types """ def default(self, obj): if isinstance(obj, (np.int_, np.intc, np.intp, np.int8, np.int16, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64)): return int(obj) elif isinstance(obj, (np.float_, np.float16, np.float32, np.float64)): return float(obj) elif isinstance(obj, (np.ndarray,)): return obj.tolist() return json.JSONEncoder.default(self, obj)

그런 다음 다음을 실행합니다.

 import json #print(json.dumps(my_data[:2], indent=4, cls=NumpyEncoder))) with open(my_dir+'/my_filename.json', 'w') as f: json.dumps(my_data, indent=4, cls=NumpyEncoder)))

np.array()의 경우 목록 대신 문자열을 반환하고 싶을 수도 있습니다. 배열이 행에 분산된 목록으로 인쇄되므로 배열이 크거나 많을 경우 출력이 폭발할 것이기 때문입니다. 주의 사항: 나중에 원래 배열로 다시 가져오기 위해 덤프된 사전에서 항목에 액세스하는 것이 더 어렵습니다. 그러나 배열의 문자열만 사용하는 것이 마음에 들지 않는다면 사전을 더 읽기 쉽게 만들 수 있습니다. 그런 다음 교환:

 elif isinstance(obj, (np.ndarray,)): return obj.tolist()

와 함께:

 elif isinstance(obj, (np.ndarray,)): return str(obj)

또는 그냥:

 else: return str(obj)

questionto42

출처 : http:www.stackoverflow.com/questions/12309269/how-do-i-write-json-data-to-a-file

반응형