首页  >  问答  >  正文

python - 数据库提取出的数据转json

我从数据库中取出两列数据得到

data = [['美国', 46], ['英国', 27], ['中国', 26]]

如何转换为json格式的文件

{
    {
        name: '美国',
        value: 46
    },
    {
        name: '英国',
        value: 27
    },
    {
        name: '中国',
        value: 26
    },
}

求相关的python代码。最好能附上注释,本人初学者,多包涵,真的不是很会这个问题。

PHP中文网PHP中文网2741 天前740

全部回复(2)我来回复

  • PHP中文网

    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

    回复
    0
  • PHP中文网

    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

    • 寫到文件裡

    (1) 將 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), 製造出一個字典。

    (2) 利用 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 轉義

    (3) 寫到文件裡

    沒什麼特別的, 使用 with 處理文件開關, 利用 print(file=XXX) rrreee

    显然不合规定, 所以猜测:
    rrreee

    才是你要的。 作法

    rrreee 🎜作法方面应该大家的方法都大同小异, 大致上分成三个部分:🎜
    • 🎜将 data 转为想要的形式: list of dictionary🎜
    • 🎜利用 json module 将 data 转为 json_data🎜
    • 🎜写到文件里🎜

    (1) 将 data 转为想要的形式: list of dictionary

    🎜第一个部分的做法差异比较大, 我选择先制造出 names 这个 list:🎜 rrreee 🎜其实这跟:🎜 rrreee 🎜是一样的, 但是我满喜欢使用 split 的作法的, 写起来比较快 (项目多的时候才不会要打那么多的引号)。 🎜 🎜接着我利用一个 list comprehension 去制造 list of dictionary:🎜 rrreee 🎜首先使用for d in data 来迭代data 中的一个一个pair, 然后使用zip 去将项目名称跟对应的值结合在一起:🎜 rrreee 🎜然后 dict 可以吃进一个 iterables (每个项目是一个键值对, 比如一个二元素的 tuple), 制造出一个字典。 🎜

    (2) 利用 json module 将 data 转为 json_data

    🎜第二部分, 转出 json_data, 这相当容易, 使用 dumps 就做得到了, 请参阅 json.dumps🎜 rrreee
    • 🎜sort_keys: 会排序 json 中 object 里面的 key, 可设定可不设定🎜
    • 🎜indent: 设定缩排🎜
    • 🎜separators: 设定json 输出的分隔符号, ',' 用于分隔项目, ': ' 用于分隔键与值🎜
    • 🎜ensure_ascii: 设为 False, 让打印的时候不要使用 unicode 转义🎜

    (3) 写到文件里

    🎜没什么特别的, 使用 with 处理文件开关, 利用 print(file=XXX) 输出🎜 🎜 🎜🎜我回答过的问题🎜: Python-QA🎜

    回复
    0
  • 取消回复