问题:如何将JSON数据写入文件?
我将JSON数据存储在变量中data
。
我想将其写入文本文件进行测试,因此不必每次都从服务器获取数据。
目前,我正在尝试:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
我收到此错误:
TypeError:必须是字符串或缓冲区,而不是dict
如何解决这个问题?
I have JSON data stored in the variable data
.
I want to write this to a text file for testing so I don’t have to grab the data from the server each time.
Currently, I am trying this:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
And I am receiving this error:
TypeError: must be string or buffer, not dict
How to fix this?
回答 0
您忘记了实际的JSON部分- data
是字典,尚未进行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)
You forgot the actual JSON part – data
is a dictionary and not yet JSON-encoded. Write it like this for maximum compatibility (Python 2 and 3):
import json
with open('data.json', 'w') as f:
json.dump(data, f)
On a modern system (i.e. Python 3 and UTF-8 support), you can write a nicer file with
import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
回答 1
要获取utf8编码的文件,而不是Python 2可接受答案中的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'
to 的参数open
仍然是必需的。
为避免将数据的编码副本存储在内存中(结果为dumps
),并在Python 2和3中输出utf8编码的字节串,请使用:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
该codecs.getwriter
调用在Python 3中是多余的,但对于Python 2是必需的
可读性和大小:
使用可以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
(如dinos66所建议的)添加到dump
或的参数,进一步提高可读性dumps
。这样,您将在json文件中获得一个很好的缩进排序结构,但要付出稍大的文件大小。
To get utf8-encoded file as opposed to ascii-encoded in the accepted answer for Python 2 use:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
The code is simpler in Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
On Windows, the encoding='utf-8'
argument to open
is still necessary.
To avoid storing an encoded copy of the data in memory (result of dumps
) and to output utf8-encoded bytestrings in both Python 2 and 3, use:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
The codecs.getwriter
call is redundant in Python 3 but required for Python 2
Readability and size:
The use of ensure_ascii=False
gives better readability and smaller size:
>>> 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
Further improve readability by adding flags indent=4, sort_keys=True
(as suggested by dinos66) to arguments of dump
or dumps
. This way you’ll get a nicely indented sorted structure in the json file at the cost of a slightly larger file size.
回答 2
我会稍作修改,对上述答案进行回答,那就是编写一个美化的JSON文件,人眼可以更好地阅读。为此,sort_keys
以True
和传递indent
4个空格字符就可以了。还要注意确保不会将ASCII代码写入您的JSON文件中:
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)
I would answer with slight modification with aforementioned answers and that is to write a prettified JSON file which human eyes can read better. For this, pass sort_keys
as True
and indent
with 4 space characters and you are good to go. Also take care of ensuring that the ascii codes will not be written in your JSON file:
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile, sort_keys = True, indent = 4,
ensure_ascii = False)
回答 3
使用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时(否则所有内容将排在一行中), sort_keys
:对字典的键进行排序。如果要使用diff工具比较json文件/将其置于版本控制下,则此功能很有用。 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
备择方案
对于您的应用程序,以下内容可能很重要:
- 其他编程语言的支持
- 阅读/写作表现
- 紧凑度(文件大小)
也可以看看: 数据序列化格式的比较
如果您想寻找一种制作配置文件的方法,则可能需要阅读我的短文《Python中的配置文件》。
Read and write JSON files with Python 2+3; works with 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)
Explanation of the parameters of json.dump
:
indent
: Use 4 spaces to indent each entry, e.g. when a new dict is started (otherwise all will be in one line), sort_keys
: sort the keys of dictionaries. This is useful if you want to compare json files with a diff tool / put them under version control. separators
: To prevent Python from adding trailing whitespaces
With a package
Have a look at my utility package mpu
for a super simple and easy to remember one:
import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)
Created JSON file
{
"a list":[
1,
42,
3.141,
1337,
"help",
"€"
],
"a string":"bla",
"another dict":{
"foo":"bar",
"key":"value",
"the answer":42
}
}
Common file endings
.json
Alternatives
For your application, the following might be important:
- Support by other programming languages
- Reading / writing performance
- Compactness (file size)
See also: Comparison of data serialization formats
In case you are rather looking for a way to make configuration files, you might want to read my short article Configuration files in Python
回答 4
对于那些尝试转储希腊语或其他“异类”语言(例如我)但也遇到奇怪字符(例如和平符号(\ u262E)或通常包含在json格式数据中的其他字符)的问题(unicode错误)的人例如Twitter,解决方案可能如下(sort_keys显然是可选的):
import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))
For those of you who are trying to dump greek or other “exotic” languages such as me but are also having problems (unicode errors) with weird characters such as the peace symbol (\u262E) or others which are often contained in json formated data such as Twitter’s, the solution could be as follows (sort_keys is obviously optional):
import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))
回答 5
我没有足够的声誉来添加评论,所以我只在这里写下关于此烦人的TypeError的一些发现:
基本上,我认为这仅json.dump()
是Python 2中的函数错误- 即使使用encoding = 'utf-8'
参数打开文件,也无法转储包含非ASCII字符的Python(字典/列表)数据。(即,无论您做什么)。但是,json.dumps()
可以在Python 2和3上使用。
为了说明这一点,请遵循phihag的答案:他的答案中的代码在Python 2中会中断TypeError: must be unicode, not str
,如果data
包含非ASCII字符,则会出现exception 。(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中工作正常。
I don’t have enough reputation to add in comments, so I just write some of my findings of this annoying TypeError here:
Basically, I think it’s a bug in the json.dump()
function in Python 2 only – It can’t dump a Python (dictionary / list) data containing non-ASCII characters, even you open the file with the encoding = 'utf-8'
parameter. (i.e. No matter what you do). But, json.dumps()
works on both Python 2 and 3.
To illustrate this, following up phihag’s answer: the code in his answer breaks in Python 2 with exception TypeError: must be unicode, not str
, if data
contains non-ASCII characters. (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)
It however works fine in Python 3.
回答 6
使用JSON使用json.dump()或json.dumps()在文件中写入数据。这样写即可将数据存储在文件中。
import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
json.dump(data, txtfile)
列表中的此示例存储到文件中。
Write a data in file using JSON use json.dump() or json.dumps() used. write like this to store data in file.
import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
json.dump(data, txtfile)
this example in list is store to a file.
回答 7
要使用缩进“漂亮打印”来编写JSON:
import json
outfile = open('data.json')
json.dump(data, outfile, indent=4)
另外,如果您需要调试格式不正确的JSON,并希望得到有用的错误消息,请使用import simplejson
库而不是import json
(功能应相同)
To write the JSON with indentation, “pretty print”:
import json
outfile = open('data.json')
json.dump(data, outfile, indent=4)
Also, if you need to debug improperly formatted JSON, and want a helpful error message, use import simplejson
library, instead of import json
(functions should be the same)
回答 8
json.dump(data, open('data.txt', 'wb'))
json.dump(data, open('data.txt', 'wb'))
回答 9
将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('')
Writing JSON to a File
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)
Reading JSON from a File
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('')
回答 10
如果您尝试使用json格式将pandas数据帧写入文件,我建议您这样做
destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()
if you are trying to write a pandas dataframe into a file using a json format i’d recommend this
destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()
回答 11
以前所有的答案都是正确的,这是一个非常简单的示例:
#! /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()
All previous answers are correct here is a very simple example:
#! /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()
回答 12
接受的答案很好。但是,我遇到了“不是json可序列化”错误。
这是我将其固定open("file-name.json", 'w')
为输出的方式:
output.write(str(response))
尽管它不是一个很好的解决方案,因为它创建的json文件不会使用双引号,但是如果您希望快速又肮脏的话,那就太好了。
The accepted answer is fine. However, I ran into “is not json serializable” error using that.
Here’s how I fixed it
with open("file-name.json", 'w')
as output:
output.write(str(response))
Although it is not a good fix as the json file it creates will not have double quotes, however it is great if you are looking for quick and dirty.
回答 13
可以将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)
The JSON data can be written to a file as follows
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]}]
Write to a file:
with open('text1.json', 'w') as f:
json.dump(hist1, f)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。