如何将存储在字典数据中的JSON数据写入文件?

f = open('data.json', 'wb')
f.write(data)

这会导致错误:

TypeError:必须是字符串或缓冲区,而不是dict


当前回答

使用Python 2+3读写JSON文件;使用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个空格来缩进每个条目,例如,当一个新的dict开始时(否则所有的都将在一行中),sortkeys:对字典的关键字进行排序。如果您想将json文件与diff工具进行比较/将其置于版本控制之下,这非常有用。分隔符:防止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文件

选择

CSV:超简单格式(读写)JSON:适合编写人类可读数据;非常常用(读写)YAML:YAML是JSON的超集,但更易于阅读(读写,JSON和YAML的比较)pickle:Python序列化格式(读写)MessagePack(Python包):更紧凑的表示(读写)HDF5(Python包):适合矩阵(读写)XML:也存在*叹息*(读写)

对于您的应用程序,以下内容可能很重要:

其他编程语言的支持读/写性能紧凑性(文件大小)

另请参阅:数据序列化格式的比较

如果您正在寻找创建配置文件的方法,您可能需要阅读我的Python配置文件短文

其他回答

我没有足够的声誉来添加评论,所以我只在这里写下我对这个烦人的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.dump(data, open('data.txt', 'wb'))

如果您试图使用json格式将panda数据帧写入文件,我建议您这样做

destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()

data是Python字典。在编写之前,需要将其编码为JSON。

使用此选项可获得最大兼容性(Python 2和3):

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

在现代系统(即Python 3和UTF-8支持)上,您可以使用以下方法编写更好的文件:

import json
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

请参阅json文档。

我会对前面提到的答案稍作修改,即编写一个经过修饰的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)