Объединить несколько файлов JSON (более двух) - PullRequest
0 голосов
/ 18 октября 2018

Я хотел бы объединить несколько файлов JSON в один файл.Все эти файлы имеют одинаковую структуру.Например, я создал три файла, которые будут выглядеть следующим образом:

ExampleFile_1

    {
      "items": [
        {
          "answers": [
            {
              "creation_date": 1538172165
            },
            {
              "creation_date": 1538172205
            },
            {
              "creation_date": 1538172245
            }
         ],
       "creation_date": 1538172012,
       "question_id": 52563137
       }
      ]
    }

ExampleFile_2

    {
      "items": [
        {
          "answers": [
            {
              "creation_date": 1538326991
            }
          ],
        "creation_date": 1538172095,
        "question_id": 52563147
        },
        {
          "answers": [
            {
              "creation_date": 1538180453
            }
          ],
        "creation_date": 1538172112,
        "question_id": 52563150
        }
      ]
    }

ExampleFile_3

   {
       "items": [
          {
            "answers": [
              {
                 "creation_date": 1538326991
              }
            ],
              "creation_date": 1538172095,
              "question_id": 52563147
           }
        ]
     }

Теперь я хотел бы объединить все три файла в списке "items" в один файл, который затем будет выглядеть так:

merged_json.json

   {
       "items": [
        {
         "answers": [
            {
              "creation_date": 1538172165
            },
            {
              "creation_date": 1538172205
            },
            {
              "creation_date": 1538172245
            }
          ],
            "creation_date": 1538172012,
            "question_id": 52563137
          },
          {
            "answers": [
             {
               "creation_date": 1538326991
             }
            ],
           "creation_date": 1538172095,
           "question_id": 52563147
          },
          {
           "answers": [
             {
               "creation_date": 1538180453
             }
            ],
            "creation_date": 1538172112,
            "question_id": 52563150
          },
          {
            "answers": [
              {
                 "creation_date": 1538326991
              }
            ],
            "creation_date": 1538172095,
            "question_id": 52563147
           }
        ]
     }

Таким образом, как и выше, "items" следует объединить.

Я уже пытался найти решение, но не смог найти его.Это то, что я получил до сих пор:

read_files = glob.glob("ExampleFile*.json")
output_list = []

for f in read_files:
    with open(f, "rb") as infile:
        output_list.append(json.load(infile))

all_items = []
for json_file in output_list:
    all_items += json_file['items']

textfile_merged = open('merged_json.json', 'w')
textfile_merged.write(str(all_items))
textfile_merged.close()

Это, к сожалению, оставляет мне испорченный файл json, который состоит только из dicts внутри "items".

Как мне создатьтакой файл как merged_json.json?

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

Я предлагаю вам использовать json, что характерно для манипулирования объектами JSON.Вы можете сделать что-то вроде этого:

    import json

with open('example1.json') as f:
    data1 = json.load(f)

with open('example2.json') as f:
    data2 = json.load(f)

with open('example3.json') as f:
    data3 = json.load(f)

items1 = data1["items"]
#print(json.dumps(items1, indent=2))
items2 = data2["items"]
items3 = data3["items"]

listitem = [items1, items2, items3]
finaljson = {"items" : []}

finaljson["items"].append(items1)
finaljson["items"].append(items2)
finaljson["items"].append(items3)
print(json.dumps(finaljson, indent=2))

with open('merged_json.json', "w") as f:
    f.write(json.dumps(finaljson, indent=2))

, где json.load() преобразует строку в объект json, а json.dumps() преобразует json в строку.Параметр indent позволяет распечатать объект в развернутом виде.

0 голосов
/ 18 октября 2018
read_files = glob.glob("ExampleFile*.json")                                                                                                                                                                         
output_list = []                                                                                                                                                                                                    

for f in read_files:                                                                                                                                                                                                
with open(f, "rb") as infile:                                                                                                                                                                                     
   output_list.append(json.load(infile))                                                                                                                                                                           

final_json = {}                                                                                                                                                                                                                                                                                                                                                                                             
all_items = []                                                                                                                                                                                                      
for json_file in output_list:                                                                                                                                                                                       
   all_items.extend(json_file['items'])                                                                                                                                                                              

final_json['items'] = all_items                                                                                                                                                                                     

textfile_merged = open('merged_json.json', 'w')                                                                                                                                                                     
textfile_merged.write(str(final_json)) 
0 голосов
/ 18 октября 2018

Вы используете модуль json для преобразования файла JSON в объекты Python, но вы не используете модуль для преобразования этих объектов Python back в JSON.Вместо этого в конце

textfile_merged.write(str(all_items))

попробуйте это:

json.dump({ "items": all_items }, textfile_merged)

(Обратите внимание, что это также оборачивает массив all_items в словарь, чтобы вы получили ожидаемый результатв противном случае выводом будет массив JSON, а не объект с ключом "items".

0 голосов
/ 18 октября 2018

Способ, которым вы могли бы сделать это и который привел бы к более чистому коду для определения функции, которая принимает два объекта JSON и возвращает комбинацию этих двух.

def merge (json_obj_1, json_obj_2):
    items = json_obj_1['items'] + json_obj_2['items']
    return { 'items': items }

Затем, после того как у вас есть output_list:

result = reduce(merge, output_list)

Результатом будет искомый объект.

Если вы не знакомы с функцией уменьшения, проверьте эту веб-страницу:

http://book.pythontips.com/en/latest/map_filter.html

В нем кратко поясняется использование системы Reduce, а также карта и фильтр.Они очень полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...