如何将JSON数据写入文件?

时间:2012-09-06 22:21:22

标签: python json

我将JSON数据存储在变量data中。

我想将其写入文本文件进行测试,因此我不必每次都从服务器获取数据。

目前,我正在尝试这个:

obj = open('data.txt', 'wb')
obj.write(data)
obj.close

我收到错误:

TypeError: must be string or buffer, not dict

如何解决这个问题?

14 个答案:

答案 0 :(得分:1710)

您忘记了实际的JSON部分 - data是一个字典,还没有JSON编码。写得像这样:

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

注意:适用于3.x和2.x。

答案 1 :(得分:244)

获取 utf8 -encoded 文件,而不是 ascii

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上,encoding='utf-8'的{​​{1}}参数仍然是必需的。

为避免在Python 2和3中存储数据的编码副本(open的结果)并输出 utf8-encoded 字节串,请使用:

dumps

{3}中的import json, codecs with open('data.txt', 'wb') as f: json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False) 调用是多余的,但Python 2需要


可读性和尺寸:

使用codecs.getwriter可提供更好的可读性和更小的尺寸:

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

答案 2 :(得分:154)

我会回答上述答案的略微修改,那就是编写一个美化的JSON文件,人眼可以更好地阅读。为此,将sort_keys作为Trueindent传递4个空格字符,您就可以了。还要注意确保不会在您的JSON文件中写入ascii代码:

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

答案 3 :(得分:101)

使用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个空格缩进每个条目,例如当一个新的词典开始时(否则所有都将在一行),
  • sort_keys:对词典的键进行排序。如果要将json文件与diff工具进行比较/将它们置于版本控制之下,这非常有用。
  • separators:防止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

替代

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

  • 其他编程语言的支持
  • 阅读/写作表现
  • 紧凑性(文件大小)

另请参阅:Comparison of data serialization formats

如果您正在寻找制作配置文件的方法,您可能需要阅读我的简短文章Configuration files in Python

答案 4 :(得分:21)

对于那些试图抛弃希腊语或其他“异国情调”语言的人,例如我,但也有问题(unicode错误)与奇怪的字符,如和平符号(\ u262E)或其他通常包含在json格式化了Twitter的数据,解决方法如下(sort_keys显然是可选的):

let myArray = [1,2,3,4,5,6,7]

myLabel.text = String(format: "%d", myArray[indexPath.row])

答案 5 :(得分:10)

我没有足够的声誉来添加评论,所以我只是在这里写下我对这个烦人的TypeError的一些发现:

基本上,我认为它只是Python中json.dump()函数的一个错误 2 - 它无法转储包含非的Python(字典/列表)数据-ASCII字符,甚至使用encoding = 'utf-8'参数打开文件。 (即不管你做什么)。但是,json.dumps()适用于Python 2和3。

为了说明这一点,请跟进phihag的回答:如果TypeError: must be unicode, not str包含非ASCII字符,则他的答案中的代码会在Python 2中出现异常data。 (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中运行良好。

答案 6 :(得分:7)

使用JSON使用 json.dump() json.dumps()将数据写入文件。 这样写就是将数据存储在文件中。

import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
    json.dump(data, txtfile)

列表中的这个例子存储到文件中。

答案 7 :(得分:4)

json.dump(data, open('data.txt', 'wb'))

答案 8 :(得分:3)

要使用缩进形式“漂亮打印”来编写JSON:

import json

outfile = open('data.json')
json.dump(data, outfile, indent=4)

此外,如果您需要调试格式不正确的JSON,并希望得到有用的错误消息,请使用import simplejson库,而不要使用import json(功能应该相同)

答案 9 :(得分:2)

如果您尝试使用json格式将pandas数据帧写入文件,我建议

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

答案 10 :(得分:1)

所有先前的答案都是正确的,这是一个非常简单的示例:

#! /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()

enter image description here

答案 11 :(得分:1)

接受的答案很好。但是,我遇到了“不是json可序列化的”错误。

这是我修复它的方式 以open("file-name.json", 'w')作为输出:

output.write(str(response))

尽管这不是一个很好的解决方案,因为它创建的json文件不会使用双引号,但是如果您希望快速又肮脏的话,那就太好了。

答案 12 :(得分:1)

可以按照以下方式将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)

答案 13 :(得分:0)

将JSON写入文件

import json

data = {}
data['people'] = []
data['people'].append({
    'name': 'Scott',
    'website': 'stackabuse.com',
    'from': 'Nebraska'
})
data['people'].append({
    'name': 'Larry',
    'website': 'google.com',
    'from': 'Michigan'
})
data['people'].append({
    'name': 'Tim',
    'website': 'apple.com',
    'from': 'Alabama'
})

with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

从文件读取JSON

import json

with open('data.txt') as json_file:
    data = json.load(json_file)
    for p in data['people']:
        print('Name: ' + p['name'])
        print('Website: ' + p['website'])
        print('From: ' + p['from'])
        print('')