我从数据库中取出两列数据得到
data = [['美国', 46], ['英国', 27], ['中国', 26]]
如何转换为json格式的文件
{
{
name: '美国',
value: 46
},
{
name: '英国',
value: 27
},
{
name: '中国',
value: 26
},
}
求相关的python代码。最好能附上注释,本人初学者,多包涵,真的不是很会这个问题。
PHP中文网2017-04-18 09:30:56
我觉得你要的结果有可能是:
[
{
"name": "美国",
"value": 46
},
{
"name": "英国",
"value": 27
},
{
"name": "中国",
"value": 26
}
]
或者:
{
"data": [
{
"name": "美国",
"value": 46
},
{
"name": "英国",
"value": 27
},
{
"name": "中国",
"value": 26
}
]
}
import json
def convert_to_json_string_1(data):
return json.dumps([{'name': i[0], 'value': i[1]} for i in data], indent=4)
def convert_to_json_string_2(data):
return json.dumps({'data': [{'name': i[0], 'value': i[1]} for i in data]}, indent=4)
json格式其实是把Python对象序列化到一个纯文本文件中(针对Python来说)
json.dumps函数把一个python对象转换(序列化)成json字符串,indent意思是使用4个空格来缩进,这个字符串也就是正常的字符串,你可以:
with open('some-file.json', 'w') as handle:
handle.write(convert_to_json_string_1(data)
对于初学者上面的代码有可能不是很好理解,下面把第一个函数写的白痴一点:
def convert_to_json_string_1(data):
ret = [] # 需要序列化的列表
for i in data:
tmp = {'name': i[0], 'value': i[1]} # 通过data的每一个元素构造一个字典
ret.append(tmp)
ret = json.dumps(ret, indent=4)
return ret
PHP中文网2017-04-18 09:30:56
@pylego 有点出一个问题, 你的输出范例并非标准的json (关于json 的标准定义请参照:Introducing JSON), {}
是js 的object, 类似于Python 的dictionary, 他应该是由键值对组成的, 你给的范例:{}
是 js 的 object, 類似於 Python 的 dictionary, 他應該是由鍵值對組成的, 你給的範例:
{
{
name: '美国',
value: 46
},
{
name: '英国',
value: 27
},
{
name: '中国',
value: 26
},
}
顯然不合規定, 所以猜測:
[
{
"name": "美国",
"value": 46
},
{
"name": "英国",
"value": 27
},
{
"name": "中国",
"value": 26
}
]
才是你要的。
import json
data = [['美国', 46], ['英国', 27], ['中国', 26]]
names = 'name value'.split()
data = [dict(zip(names, d)) for d in data]
with open('out.json', 'w') as writer:
json_data = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False)
print(json_data, file=writer)
作法方面應該大家的方法都大同小異, 大致上分成三個部分:
將 data
轉為想要的形式: list of dictionary
利用 json
module 將 data
轉為 json_data
寫到文件裡
data
轉為想要的形式: list of dictionary第一個部分的做法差異比較大, 我選擇先製造出 names
這個 list:
names = 'name value'.split()
其實這跟:
names = ['name', 'value']
是一樣的, 但是我滿喜歡使用 split
的作法的, 寫起來比較快 (項目多的時候才不會要打那麼多的引號)。
接著我利用一個 list comprehension 去製造 list of dictionary:
data = [dict(zip(names, d)) for d in data]
首先使用 for d in data
來迭代 data
中的一個一個 pair, 然後使用 zip
去將項目名稱跟對應的值結合在一起:
# zip
'美国', 46
| | => ('name', '美国'), ('value', 46)
'name' 'value'
然後 dict
可以吃進一個 iterables (每個項目是一個鍵值對, 比如一個二元素的 tuple), 製造出一個字典。
json
module 將 data
轉為 json_data
第二部分, 轉出 json_data
, 這相當容易, 使用 dumps
就做得到了, 請參閱 json.dumps
json_data = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False)
sort_keys
: 會排序 json 中 object
裡面的 key, 可設定可不設定
indent
: 設定縮排
separators
: 設定 json 輸出的分隔符號, ','
用於分隔項目, ': '
用於分隔鍵與值
ensure_ascii
: 設為 False
, 讓打印的時候不要使用 unicode 轉義
沒什麼特別的, 使用 with
處理文件開關, 利用 print(file=XXX)
rrreee
才是你要的。 作法
rrreee 🎜作法方面应该大家的方法都大同小异, 大致上分成三个部分:🎜data
转为想要的形式: list of dictionary🎜json
module 将 data
转为 json_data
🎜data
转为想要的形式: list of dictionarynames
这个 list:🎜
rrreee
🎜其实这跟:🎜
rrreee
🎜是一样的, 但是我满喜欢使用 split
的作法的, 写起来比较快 (项目多的时候才不会要打那么多的引号)。 🎜
🎜接着我利用一个 list comprehension 去制造 list of dictionary:🎜
rrreee
🎜首先使用for d in data
来迭代data
中的一个一个pair, 然后使用zip
去将项目名称跟对应的值结合在一起:🎜
rrreee
🎜然后 dict
可以吃进一个 iterables (每个项目是一个键值对, 比如一个二元素的 tuple), 制造出一个字典。 🎜
json
module 将 data
转为 json_data
json_data
, 这相当容易, 使用 dumps
就做得到了, 请参阅 json.dumps🎜
rrreee
sort_keys
: 会排序 json 中 object
里面的 key, 可设定可不设定🎜indent
: 设定缩排🎜separators
: 设定json 输出的分隔符号, ','
用于分隔项目, ': '
用于分隔键与值🎜ensure_ascii
: 设为 False
, 让打印的时候不要使用 unicode 转义🎜with
处理文件开关, 利用 print(file=XXX)
输出🎜
🎜
🎜🎜我回答过的问题🎜: Python-QA🎜