代码之家  ›  专栏  ›  技术社区  ›  Rio

使用pyjq解析多个json值,用逗号分隔

  •  1
  • Rio  · 技术社区  · 8 年前

    使用pyjq,我能够解析json文件中的值。我需要对输出位进行更多的格式化,以便将其导出到csv。

    import json
    import csv
    import pyjq
    
    emp_data = open('example.json', 'r')
    emp_data_parsed = json.loads(emp_data.read())
    emp = pyjq.all ('.base[].base[].uid, .base[].base[].name', emp_data_parsed)
    print emp
    

    我得到的输出

    [u'2da21174-0af8-4b5b-b02e-2957a24d70e1', u'fcc5a2c8-3a78-4cc5-9fd3-e7bd59eb36ba', u'4ecf6450-7307-466c-bf19-663ba2fbaf69', None, u'Tommy', u'Sam',
    

    要求输出如下,以便可以写入csv文件。

    uid,name
    '2da21174-0af8-4b5b-b02e-2957a24d70e1','None'
    'fcc5a2c8-3a78-4cc5-9fd3-e7bd59eb36ba','Tommy'
    '4ecf6450-7307-466c-bf19-663ba2fbaf69','Sam'
    

    下面是sample.json文件

    example.json
    {
        "base": [
            { 
                "base": [
                    {
                        "item-number": 1, 
                        "type": "access-item", 
                        "uid": "2da21174-0af8-4b5b-b02e-2957a24d70e1",  
                        "usage": { 
                            "last-date": {
                                "iso-8601": "2018-03-19T03:58-0500", 
                            }, 
                        }, 
    
                        "item-number": 2, 
                        "name": "Tommy",
                        "type": "access-item", 
                        "uid": "fcc5a2c8-3a78-4cc5-9fd3-e7bd59eb36ba", 
    
                        "item-number": 3, 
                        "name": "Sam",
                        "type": "access-item", 
                        "uid": "4ecf6450-7307-466c-bf19-663ba2fbaf69", 
                        "usage": { 
                            "last-date": {
                                "iso-8601": "2018-03-21T07:21-0500", 
                            }, 
                        },
                    }
                ], 
            }
        ], 
    }
    

    除了Pyjq,我不确定还有什么方法可以做到这一点。如果是,请告诉我。

    2 回复  |  直到 8 年前
        1
  •  2
  •   stovfl    8 年前

    问题 :我需要对输出位进行更多的格式化,以便将其导出到csv。

    无法测试 pyjp ,猜猜看 Project description 试一下:

    pyjq.all('.base[].base[] | {"uid": .uid, "item-number":.item-number}', emp_data_parsed)
    

    像这样循环JSON:

    for rec in emp_data_parsed['base'][0]['base']:
        print("{}".format(rec))
    

    产量 :

    {'uid': '2da21174-0af8-4b5b-b02e-2957a24d70e1', 'item-number': 1}, ... (omitted for brevity)
    {'uid': 'fcc5a2c8-3a78-4cc5-9fd3-e7bd59eb36ba', 'item-number': 2}, ... (omitted for brevity)
    {'uid': '4ecf6450-7307-466c-bf19-663ba2fbaf69', 'item-number': 3}, ... (omitted for brevity)
    

    输出准备就绪 csv.DictWriter 阅读 csv.DictWriter 例如:

    import csv
    
    with open('test.csv', 'w') as csv_file:
        fieldnames = ['uid', 'item-number']
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames, extrasaction='ignore')
        writer.writeheader()
    
        for record in emp_data_parsed['base'][0]['base']:
            writer.writerow(record)
    

    产量 :

    uid,name
    2da21174-0af8-4b5b-b02e-2957a24d70e1,None
    fcc5a2c8-3a78-4cc5-9fd3-e7bd59eb36ba,Tommy
    4ecf6450-7307-466c-bf19-663ba2fbaf69,Sam
    
        2
  •  1
  •   Messa    8 年前

    有趣,我知道 jq ,这是一个好主意。

    我用 JQ 用于我的数据处理。而且 grep , head 等:()当我需要使用csv时,我宁愿将csv编写一次到jsonl(反之亦然)程序,然后将它用作shell管道中的另一个工具。

    # to_csv.py
    import csv, json, sys
    rows = [json.loads(line) for line in sys.stdin]
    all_keys = []
    for row in rows:
        for key in row.keys():
            if key not in all_keys:
                all_keys.append(key)
    writer = csv.DictWriter(sys.stdout, fieldnames=all_keys, extrasaction='ignore')
    writer.writeheader()
    for row in rows:
        writer.writerow(row)
    

    用法(我必须修复 example.json 一点点):

    $ cat example.json | jq -c '.base[].base[] | { uid, name }' | python3 to_csv.py
    uid,name
    2da21174-0af8-4b5b-b02e-2957a24d70e1,
    fcc5a2c8-3a78-4cc5-9fd3-e7bd59eb36ba,Tommy
    4ecf6450-7307-466c-bf19-663ba2fbaf69,Sam