Разобрать несколько значений JSON, используя Pyjq, разделенные запятой

1

Используя 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, есть способ сделать это. Если это так, пожалуйста, дайте мне знать.

  • 0
    Соответствующий конвертированный-jes-to-csv
  • 0
    @stovfi, нет, это для получения только необходимых значений из каждого раздела и отображения или перенаправления в CSV. Другой пост - конвертировать весь JSON в CSV.
Теги:
csv

2 ответа

2
Лучший ответ

Вопрос: Мне нужно форматировать выходной бит больше, чтобы его можно было экспортировать в csv.

Не pyjp проверить с помощью pyjp, угадать из описания проекта, попробуйте:

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
  • 0
    Абсолютно идеальный @stovfl. Пожалуйста, просто отредактируйте with open('test.csv', 'w') as csv_file с with open('test.csv', 'w') as csv_file: Это работает как шарм. Большое спасибо.
  • 1
    Нет, я пытался с emp = pyjq.all('.base[].base[] | {"uid": .uid, "name": .name]}', emp_data_parsed) . И это сработало
1

Интересно, я знаю, что jq, Python-обертка - это хорошая идея.

Я использую jq для обработки данных. А также grep, head и т.д. :) Когда мне нужно работать с CSV, я скорее буду писать программу CSV-to-JSONL (или наоборот), а затем использовать ее как еще один инструмент в конвейере оболочки.

# 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
  • 0
    Да, в python pyjq.all ('.base []. Base []. Uid, .base []. Base []. Name') работает отлично. Кстати, вы знаете, как вырезать дату только из следующего значения "iso-8601": "2018-03-19T03:24-0500" из JSON?
  • 0
    Если бы в Python я использовал подстроку :) row ["iso-8601"] [: 10]
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню