如何将存储在字典数据中的JSON数据写入文件?
f = open('data.json', 'wb')
f.write(data)
这会导致错误:
TypeError:必须是字符串或缓冲区,而不是dict
如何将存储在字典数据中的JSON数据写入文件?
f = open('data.json', 'wb')
f.write(data)
这会导致错误:
TypeError:必须是字符串或缓冲区,而不是dict
当前回答
对于喜欢oneliner的人(因此,with语句不是一个选项),一个比留下悬空打开的文件描述符更干净的方法是使用pathlib中的write_text并执行以下操作:
pathlib.Path("data.txt").write_text(json.dumps(data))
在某些情况下,这在不允许语句的上下文中很有用,例如:
[pathlib.Path(f"data_{x}.json").write_text(json.dumps(x)) for x in [1, 2, 3]]
我并不是说它应该优先于使用(而且可能会慢一些),只是另一种选择。
其他回答
我没有足够的声誉来添加评论,所以我只在这里写下我对这个烦人的TypeError的一些发现:
基本上,我认为这只是Python 2中json.dump()函数中的一个bug——它无法转储包含非ASCII字符的Python(字典/列表)数据,即使您使用encoding='utf-8'参数打开文件。(即无论你做什么)。但是,json.dumps()在Python 2和3上都有效。
为了说明这一点,接下来是phihag的回答:如果数据包含非ASCII字符,他的回答中的代码在Python 2中中断,出现异常TypeError:必须是unicode,而不是str。(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文件,人眼可以更好地阅读。为此,将sort_keys传递为True,并用4个空格字符缩进,就可以开始了。还要注意确保ascii代码不会写入JSON文件:
with open('data.txt', 'w') as out_file:
json.dump(json_data, out_file, sort_keys = True, indent = 4,
ensure_ascii = False)
json.dump(data, open('data.txt', 'wb'))
对于喜欢oneliner的人(因此,with语句不是一个选项),一个比留下悬空打开的文件描述符更干净的方法是使用pathlib中的write_text并执行以下操作:
pathlib.Path("data.txt").write_text(json.dumps(data))
在某些情况下,这在不允许语句的上下文中很有用,例如:
[pathlib.Path(f"data_{x}.json").write_text(json.dumps(x)) for x in [1, 2, 3]]
我并不是说它应该优先于使用(而且可能会慢一些),只是另一种选择。
使用JSON将数据写入文件,使用JSON.dump()或JSON.dumps()。像这样写以将数据存储在文件中。
import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
json.dump(data, txtfile)
列表中的这个示例存储到文件中。