web-dev-qa-db-ja.com

JSONデータをファイルに書く方法

JSONデータが変数dataに格納されています。

毎回サーバーからデータを取得する必要がないように、テスト用にこれをテキストファイルに書き込みたい.

現在、私はこれを試みています:

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

そして、エラーを受けています:

TypeError: must be string or buffer, not dict

これを修正するには?

906
user1530318

実際のJSON部分を忘れた - dataは辞書で、まだJSONエンコードされていません。このように書いてください:

import json
with open('data.json', 'w') as outfile:
    json.dump(data, outfile)

注:3.xと2.xの両方で機能します。

1692
phihag

ascii-encodedではなくutf8-encodedファイルを取得するPython 2の使用に対する承認された回答:

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では、openへのencoding='utf-8'引数はまだ必要です。

コード化されたデータのコピーがメモリに格納されないようにし(dumpsの結果)、Python 2と3の両方でutf8-encodedバイト文字列を出力するには、

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

dumpまたはdumpsの引数にフラグindent=4, sort_keys=Truedinos66 で提案されている)を追加することによって、読みやすさをさらに向上させます。この方法では、わずかに大きいファイルサイズという代償を払って、jsonファイルにうまくインデントされたソート構造を得ることができます。

241

私は前述の答えを少し修正して答えるでしょう、そしてそれは人間の目がよりよく読むことができるきれいなJSONファイルを書くことです。これには、sort_keysTrueおよびindentに4つの空白文字を付けて渡してください。また、ASCIIコードがJSONファイルに書き込まれないように注意してください。

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

JSONファイルをPython 2 + 3で読み書きする。 Unicodeで動作します

# -*- 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での設定ファイル を読んでください。

101
Martin Thoma

ギリシャ語または私のような他の「エキゾチックな」言語をダンプしようとしているが、ピースサイン(\ u262E)のような変な文字や、json形式のデータによく含まれるその他の文字に関する問題も(Unicodeエラー) 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))
21
dinos66

私はコメントを追加するのに十分な評判を持っていません、それで私はここでこの迷惑なTypeErrorの私の発見のいくつかをここに書くだけです:

基本的に、これはPythonのjson.dump()関数のバグだと思います 2 only - 非ASCII文字を含むPython(辞書/リスト)データをダンプすることはできません、evenあなたがファイルを開くencoding = 'utf-8'パラメータを使用します。 (つまり、あなたが何をしても)。しかし、json.dumps()はPython 2と3の両方で動作します。

これを説明するために、phihagの答えをフォローアップします。彼の答えのコードは、dataが非ASCII文字を含んでいる場合、例外TypeError: must be unicode, not strでPython 2で壊れます。 (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)

しかしPython 3ではうまくいきます。

10
ibic

JSONを使用してファイルにデータを書き込むには、 json.dump() または json.dumps() usedを使用します。データをファイルに保存するには、次のように書きます。

import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
    json.dump(data, txtfile)

リスト内のこの例はファイルへの格納です。

7
Vishal Gediya
json.dump(data, open('data.txt', 'wb'))
4
Alexander

JSONを字下げ付きで書くには、 "pretty print":

import json

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

また、不適切にフォーマットされたJSONをデバッグする必要があり、便利なエラーメッセージが必要な場合は、import simplejsonの代わりにimport jsonライブラリを使用してください(関数は同じであるべきです)

3
James Wierzba

あなたが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()

enter image description here

1
grepit

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)

受け入れられた答えは大丈夫です。しかし、私はそれを使用して "JSONシリアライズ可能ではない"エラーに遭遇しました。

出力としてopen("file-name.json", 'w')を使用して修正した方法は次のとおりです。

output.write(str(response))

作成したjsonファイルには二重引用符が含まれないため、これは適切な修正方法ではありませんが、すばやく汚いファイルを探しているのであれば最適です。

1
Akshat Bajaj