JSONデータが変数data
に格納されています。
毎回サーバーからデータを取得する必要がないように、テスト用にこれをテキストファイルに書き込みたい.
現在、私はこれを試みています:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
そして、エラーを受けています:
TypeError: must be string or buffer, not dict
これを修正するには?
実際のJSON部分を忘れた - data
は辞書で、まだJSONエンコードされていません。このように書いてください:
import json
with open('data.json', 'w') as outfile:
json.dump(data, outfile)
注:3.xと2.xの両方で機能します。
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=True
( dinos66 で提案されている)を追加することによって、読みやすさをさらに向上させます。この方法では、わずかに大きいファイルサイズという代償を払って、jsonファイルにうまくインデントされたソート構造を得ることができます。
私は前述の答えを少し修正して答えるでしょう、そしてそれは人間の目がよりよく読むことができるきれいな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)
# -*- 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)
{
"a list":[
1,
42,
3.141,
1337,
"help",
"€"
],
"a string":"bla",
"another dict":{
"foo":"bar",
"key":"value",
"the answer":42
}
}
.json
アプリケーションにとっては、次のことが重要です。
データ直列化フォーマットの比較 も参照してください。
設定ファイルを作成する方法を探しているのであれば、私の短い記事 Pythonでの設定ファイル を読んでください。
ギリシャ語または私のような他の「エキゾチックな」言語をダンプしようとしているが、ピースサイン(\ 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))
私はコメントを追加するのに十分な評判を持っていません、それで私はここでこの迷惑な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ではうまくいきます。
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)
リスト内のこの例はファイルへの格納です。
json.dump(data, open('data.txt', 'wb'))
JSONを字下げ付きで書くには、 "pretty print":
import json
outfile = open('data.json')
json.dump(data, outfile, indent=4)
また、不適切にフォーマットされたJSONをデバッグする必要があり、便利なエラーメッセージが必要な場合は、import simplejson
の代わりにimport json
ライブラリを使用してください(関数は同じであるべきです)
あなたが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)
受け入れられた答えは大丈夫です。しかし、私はそれを使用して "JSONシリアライズ可能ではない"エラーに遭遇しました。
出力としてopen("file-name.json", 'w')
を使用して修正した方法は次のとおりです。
output.write(str(response))
作成したjsonファイルには二重引用符が含まれないため、これは適切な修正方法ではありませんが、すばやく汚いファイルを探しているのであれば最適です。