我如何将JSON数据写入文件?
我有JSON数据存储在变量data
中。
我想把它写到一个文本文件中进行测试,这样我就不必每次都从服务器上抓取数据。
目前,我正在尝试这样做。
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
并收到了错误。
TypeError: must be string or buffer, not dict`.
如何解决这个问题?
982
13
你忘记了实际的JSON部分--
data
是一个字典,还没有进行JSON编码。像这样写它以获得最大的兼容性 (Python 2 和 3)。在现代系统中(即Python 3和UTF-8支持),你可以写一个更好的文件,用
要获得utf8编码的文件,而不是Python 2的公认答案中的ascii编码的,请使用。
在Python 3中,该代码更简单。
在Windows上,
encoding='utf-8'
参数给open
仍是必要的。为了避免在内存中存储数据的编码副本(`dumps'的结果),并在Python 2和3中输出utf8编码的字节符,使用:
codecs.getwriter
调用在Python 3中是多余的,但在Python 2中是必需的。可读性和大小:
使用
ensure_ascii=False
会有更好的可读性和更小的尺寸。通过在
dump
或dumps
的参数中添加标志indent=4, sort_keys=True
(如dinos66所建议)来进一步提高可读性。这样你会在json文件中得到一个很好的缩进排序的结构,代价是文件大小稍大。我的回答与上述答案略有不同,那就是写一个经过美化的JSON文件,让人眼能更好地阅读。为此,将
sort_keys
设为True
,indent
设为4个空格,就可以了。还要注意确保ascii代码不会被写入你的JSON文件中。用Python 2+3读取和写入JSON文件。
适用于unicode
json.dump
的参数说明。indent
。 使用4个空格来缩进每个条目,例如:当一个新的dict开始时(否则所有的dict都会在一行中),使用4个空格来缩进。 当一个新的dict开始时,使用4个空格来缩进每个条目(否则所有的条目都会在一行中)。sort_keys
。 对字典的键进行排序。 如果你想用差分工具比较json文件/将它们置于版本控制之下,这很有用。separators
。 防止Python添加尾部的空白字符。##有一个包
请看我的实用程序包
mpu
,超级简单易记。创建JSON文件
常见的文件结尾
.json
替代品
对于您的应用,以下内容可能很重要。
另见。 数据序列化格式比较
如果你正在寻找一种制作配置文件的方法,你可能会想阅读我的短文Python中的配置文件
对于那些试图转储希腊语或其他"异国情调" 语言,如我,但也遇到了一些问题(unicode错误),如和平符号(\u262E)或其他经常包含在json格式化数据(如Twitter's)中的奇怪字符,解决方案可以如下(sort_keys显然是可选的)。
我没有足够的声誉来添加评论,所以我只是在这里写一些我对这个恼人的TypeError的发现。
基本上,我认为这是Python中
json.dump()
函数中的一个bug,只有在Python中2--它不能转储包含非ASCII字符的Python(字典/列表)数据,即使你用encoding = 'utf-8'
参数打开文件。 (即 不管你怎么做)。) 但是,json.dumps()
在Python 2和3上都能工作。为了说明这一点,跟进 phihag'的回答。 他的答案中的代码在 Python 2 中出现了异常
TypeError: must be unicode, not str
, ifdata
contains nonASCII characters. (Python 2.7.6, Debian)。然而,它在Python 3中工作得很好。
使用json.dump()或json.dumps()在文件中写入数据。 这样写就可以将数据存储在文件中。
这个例子在列表中被存储到一个文件。
要写出带缩进的JSON,"pretty print"。
另外,如果你需要调试格式不正确的JSON,并且想要一个有用的错误信息,请使用
import simplejson
库,而不是import json
(功能应该是一样的)。如果你想把pandas的数据框写成一个使用json格式的文件,我推荐这样做
之前的答案都是正确的这里举个很简单的例子。
[![在此输入图像描述][1]][1]
[1]: https://i.stack.imgur.com/1CNhG.png
接受的答案是好的。 但是,我在使用该方法时遇到了"is not json serializable" 错误。
我是这样解决的 用
open("file-name.json", 'w')
作为输出。output.write(str(response))
。虽然它不是一个很好的修复方法,因为它创建的json文件不会有双引号,但是如果你正在寻找快速和肮脏的方法,它是伟大的。
JSON数据可以被写入一个文件,如下所示
写入一个文件。