关于Python:如何将JSON数据写入文件?

How do I write JSON data to a file?

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

我想把它写到一个文本文件中进行测试,这样我就不必每次都从服务器中获取数据。

目前,我正在尝试:

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

我收到错误:

TypeError: must be string or buffer, not dict

如何解决这个问题?


你忘了JSON是一部分目前尚未data词典和JSON编码的。是这样写的:

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

注:作品在3.x和2.0。


为了得到UTF8编码的ASCII编码的文件到喷嘴对置在接受答案2:在Python中使用

1
2
3
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
  f.write(json.dumps(data, ensure_ascii=False))

该代码是基于Python的simpler 3:

1
2
3
import json
with open('data.txt', 'w') as f:
  json.dump(data, f, ensure_ascii=False)

在Windows的问题,encoding='utf-8'open仍然是必要的。

一种避免复制的数据储存在记忆编码(result of dumps)和两个输出bytestrings UTF8编码,Python中的2和3,使用方法:

1
2
3
import json, codecs
with open('data.txt', 'wb') as f:
    json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)

在Python中的呼叫是一codecs.getwriterredundant 2 3,但需要在Python

readability和大小:

使用了更好的ensure_ascii=Falsereadability和较小的尺寸:

1
2
3
4
5
6
7
8
9
>>> 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

进一步提高通过添加readability(旗)的建议indent=4, sort_keys=Truedinos66)或受dumpdumps)。你会得到这样的nicely indented JSON文件中的类结构,在成本点较大的文件大小。


我要的答案与答案和轻微的修改与aforementioned就是写一个prettified JSON文件可以读更好的人的眼睛。这是通的,sort_keysTrueindent4空间与人物和你是好去。也照顾的ASCII码将确保不会被写在你的JSON文件。

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


读与写的Python和JSON文件2+3与Unicode的作品;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- 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文件与不同的工具在他们控制下的版本号。
  • Python的:从预防separatorswhitespaces加尾

与封装

有一个看我的超级简单实用mpu是封装和容易记住的一个:

1
2
3
import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)

创建JSON文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
   "a list":[
        1,
        42,
        3.141,
        1337,
       "help",
       "€"
    ],
   "a string":"bla",
   "another dict":{
       "foo":"bar",
       "key":"value",
       "the answer":42
    }
}

普通文件的结局

.json

选择

  • 超级简单的格式(CSV):读与写
  • JSON是可读的写作:尼斯(很常用的数据;读取及写入)
  • YAML是一个JSON:YAML superset),但更容易阅读(阅读及写,比较和YAML格式)
  • 泡菜:Python serialization格式(读与写
  • messagepack(Python Package):更紧凑的表示(读与写
  • (调用Python Package):如果尼斯(读与写的矩阵)
  • :*叹气*我为XML(读与写

为您的应用程序,下面的可能是重要的。

  • 其他编程语言的支持。
  • 阅读和写作的性能
  • 紧性(文件大小)

国有企业也比较serialization:日期格式

你的情况,而不是寻找的方式,使配置文件,你可能想读我的配置文件在Python的短文章


为那些你谁是试图转储或其他"异国情调"的希腊语,但我也是有这样的问题发生的奇怪的字符的Unicode)与和平的符号(如u262e)或他人通常是包含在formated JSON数据,如Twitter的,该解决方案可以被排序为(_显然是可选的)。

1
2
3
import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
     f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))


我有足够的信誉来添加评论,所以我想写一些我的调查结果在本annoying TypeError

基本上,我认为这是错误json.dump()函数在Python中的2 -它可以只转储(T /列表的Python字典含非ASCII字符数据),即使你用开放的encoding = 'utf-8'参数文件。(即在你的物。但在Python中,json.dumps()厂2和3。

这说明指南,随访phihag’s答案:答案:代码在Python中与他的休息TypeError: must be unicode, not str2异常,如果data包含非ASCII字符。(Python 2.7.6,Debian的):

1
2
3
4
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文件中写入数据,使用json.dump json.dumps()或()的使用。写数据到文件中像这样的商店。

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

在这个例子中是存储到文件中。


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


要使用缩进编写JSON,"漂亮的打印":

1
2
3
4
import json

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

另外,如果您需要调试格式不正确的JSON,并且需要一条有用的错误消息,请使用import simplejson库,而不是import json库(函数应该相同)。


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

1
2
3
4
destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()

JSON数据可以如下写入文件

1
2
3
4
5
6
7
8
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]}]

写入文件:

1
2
with open('text1.json', 'w') as f:
     json.dump(hist1, f)


接受的答案是好的。但是,我使用它遇到了"is not json serializable"错误。

我就是这样修理的以open("file-name.json", 'w')为输出:

output.write(str(response))

虽然它并不是一个很好的修复方法,因为它创建的JSON文件不会有双引号,但是如果您要查找快速而脏的文件,这是非常好的。


前面所有的答案都是正确的,下面是一个非常简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#! /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