Разбор текстового файла, содержащего список JSON - PullRequest
0 голосов
/ 04 мая 2018

У меня есть каталог, в который часто сбрасывается набор текстовых файлов, которые выглядят так:

  • FILEA.json
  • FILEB.json
  • FILEC.json

Каждый файл содержит «массив» JSON, который выглядит следующим образом:

[
    {
       "id" : "blah",
       "type" : "thingy",
       "ip" : "10.0.0.1",
       "extended" : {
          "var1" : "blah"
        }
    },
    {
       "id" : "blah2",
       "type" : "thingy",
       "ip" : "10.0.0.2",
       "extended" : {
          "var1" : "blah"
        }
    }
]

Я хотел бы знать, каков наиболее эффективный способ чтения этих файлов и сохранения каждой отдельной строки JSON в массив для дальнейшей обработки. Я посмотрел на json.load () , но кажется, что он читается в отдельных строках JSON, а не в «массиве» строк.

Одним из возможных решений может быть зачеркнуть конечные скобки и разделить каждый объект JSON через регулярное выражение?

РЕДАКТИРОВАТЬ: добавить пример кода:

    json_array = []
    for filename in sorted(os.listdir(CONFIG.DATA_DIR)):
        m = re.match('^.*\.JSON$', filename)
        if m:
            data = json.load(open(CONFIG.DATA_DIR+filename))
            for item in data:
                json_array.append(item)
    return json_array

1 Ответ

0 голосов
/ 04 мая 2018

Вы незаконно отформатировали JSON. У вас не может быть случайных запятых, поэтому я удалил их с выражением ниже.

Пример

from json import dumps, loads
from os import listdir
from os.path import isfile, join
from re import sub

'''This function transforms a directory of JSON array files and returns a 
   single-dimensional array of all of the items.
'''
def build_json_array(dir):
  result = []
  for f in listdir(dir):
    if isfile(join(dir, f)):
      with open(join(dir, f)) as json_data:
        json_text = sub(',\s+\]', ']', json_data.read()) # We need to repair the data
        result.extend(loads(json_text))
  return result

if __name__ == '__main__':
  print(dumps(build_json_array(CONFIG.DATA_DIR), indent=4))

Совет: Вы можете запустить данные JSON через Linter перед загрузкой и манипулированием ими.

Если ваш JSON сформирован правильно, вы можете просто загрузить данные прямо из файла.

from json import load

result.extend(load(json_data))

код гольфа

Реализован однострочник, который использует списки и сокращает массивы путем их выравнивания.

from functools import reduce
from json import dumps, load
from os import listdir
from os.path import isfile, join

def build_json_array(dir):
  return reduce(lambda x,y: x+y,(load(open(join(dir,f))) for f in listdir(dir) if isfile(join(dir,f))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...