2016-03-14 2 views
0

У меня есть JSON-файл, отформатированный как это: (многострочный для ясности)Использование питона, чтобы изменить формат файла Json

(линия 0001) .......

{ 
    "_id": "iD_0001", 
    "skills": [{ 
     "name": "Project Management" 
    }, { 
     "name": "Business Development" 
    }] 
} 

.... (строка 9999)

{ 
    "_id":"iD_9999", 
    "skills": [{ 
     "name": "Negotiation" 
    }, { 
     "name": "Banking" 
    }] 
} 

Я хотел бы запустить программу на нем, однако, программа не может прочитать его под вышеупомянутым форматом. Таким образом, я хотел бы изменить свой формат:

[{ 
    "_id": "iD_0001", 
    "skills": [{ 
     "name": "Project Management" 
    }, { 
     "name": "Business Development" 
    }] 
},{ 
    "_id":"iD_9999", 
    "skills": [{ 
     "name": "Negotiation" 
    }, { 
     "name": "Banking" 
    }] 
}] 

по существу, вкладывая все записи в одном массиве. Есть ли способ реализовать это с помощью Python или demjson?

ALTERNATIVE: Я создал программу, которая извлекает навыки в этих json-файлах и отправляет их в текстовый файл (Test.txt), однако он работает только для второго формата, а не для первого. Можете ли вы предложить модификацию, чтобы заставить ее работать для первого формата (см. Выше)? Это моя программа:

import json 
from pprint import pprint 
with open('Sample.json') as data_file:  
    data = json.load(data_file) 

    with open('Test.txt', 'w') as f: 
     for x in data: 
      for y in x["skills"]: 
        f.write(y["name"]) 
     f.close() 

РЕШЕНИЯ

Спасибо Антти Haapala для заметив катенации объектов JSon в рамках первого формата, а также Walter Витцель и Джош J предложившего альтернативных ответов , Поскольку первый формат является привязкой к отдельным объектам, программа хорошо работает, если мы загрузим первый файл Json Линия-по-линии вместо всего. Я сделал это с:

data = [] 
with open('Sample1-candidats.json') as data_file:  
for line in data_file: 
    data.append(json.loads(line)) 

    with open('Test.txt', 'w') as f: 
     for x in data: 
      for y in x["skills"]: 
        f.write(y["name"]) 
     f.close() 
+1

Первый - это не один файл JSON. 'json.load' загружает только один объект из файла за раз. Первый - это привязка нескольких объектов JSON. –

+0

Пожалуйста, проверьте это: http://stackoverflow.com/questions/8730119/retrieving-json-objects-from-a-text-file-using-python –

+0

В вашем файле примера есть литеральный '.....'между каждой записью или вы использовали это в качестве примера для сокращения копии/вставки? –

ответ

0

Вот оно. Это предполагает, что ваш файл представляет собой всего лишь кучу отдельных json-объектов, которые конкатенированы, и вам нужно преобразовать в список объектов json.

import json 
from pprint import pprint 

with open('sample.json') as data_file:  
    strData = '[' + ''.join(data_file.readlines()).replace('}\n{','},{') + ']' 
    data = eval(strData) 

with open('Test.txt', 'w') as f: 
    for x in data: 
     for y in x["skills"]: 
      f.write(y["name"]) 
+0

Решение, на которое я ссылался выше, лучше, но это также сработает. –

0

Вот шаги, которые вы можете предпринять для решения своей проблемы. Поскольку это похоже на домашнее задание, я дам вам логику и указатели, но не код.

  1. Открыть файл для чтения
  2. Чтение файла в строку переменной (если достаточно мал для ограничения памяти)
  3. Создать пустой list для вывода
  4. Разделить строку на .....
  5. json.loads каждый кусок в результате список
  6. Добавить каждый результат в ваш пустой список результатов
  7. Выпейте чашку кофе в c elebrate
+1

К сожалению, это не домашнее задание, и файлы могут стать слишком большими для ограничений памяти. Я вижу ваши рассуждения, благодарю вас! –

Смежные вопросы