协慌网

登录 贡献 社区

如何将 JSON 数据写入文件?

我将 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.

要获得utf8 编码的文件,而不是在 Python 2 的接受答案中使用ascii -encoded

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 编码的字节串,请使用:

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建议)添加到dumpdumps参数来进一步提高可读性。这样你就可以在 json 文件中获得一个很好的缩进排序结构,但代价是文件大小稍大。

我会用前面提到的答案稍作修改来回答,那就是编写一个美化的 JSON 文件,人眼可以更好地阅读。为此,将sort_keys传递为True并使用 4 个空格字符indent ,您就可以了。还要注意确保不会在您的 JSON 文件中写入 ascii 代码:

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