Как проанализировать текст в формате JSON в середине текстового файла

1

У меня есть txt файл, содержащий простой текст и текстовый блок в стиле json. Я хочу проанализировать txt и извлечь блок json для объекта python dict.

Например, txt файл может выглядеть так:

1234567
asdfjkl
{
  "Name": {
    "given ": "kevin"
  },
  "info": [
    "asdf",
    "fda",
    "sdf"
  ]
}

и там есть один и только один законный блок json в каждом txt. Не удалось найти что-либо в пакете json. Любая помощь будет оценена.

  • 0
    Эмм ... какой желаемый выход?
  • 0
    Может ли {или} происходить вне JSON? Всегда ли JSON находится в конце файла?
Показать ещё 3 комментария
Теги:

2 ответа

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

Как вы сказали, JSON всегда сзади:

from ast import literal_eval
with open('filename.txt','r') as f:
   s=f.read()
   print(literal_eval(s[s.index('{')-1:]))

Лучше использовать json.loads:

from json import loads
with open('filename.txt','r') as f:
   s=f.read()
   print(loads(s[s.index('{'):]))

Оба выхода:

{'Name': {'given ': 'kevin'}, 'info': ['asdf', 'fda', 'sdf']}
  • 1
    Да, я думаю, что второй лучше. Спасибо за ответ!
  • 1
    @ PM2Ring Правильно. Тогда не важно.
Показать ещё 3 комментария
0

Если вы контролируете ввод, не делайте этого так. Если парень или парень на входном конце - клиент/босс, проклинайте богов кода под вашим дыханием и напишите вспомогательную функцию следующим образом:

# returns a list of plaintext lines and a json string.
def split_text_and_json(filename):
    textlines = []
    jsonlines = []
    bracketcount = 0

    with open(filename) as f:
       for line in f.readlines():
           bracketcount += line.count('{')

           if bracketcount:
               jsonlines.append(line)
           else:
               textlines.append(line)
           bracketcount-=line.count('}')
    return (textlines, ''.join(jsonlines))

plaintextpart, jsonpart = split_text_and_json('file.txt')

Вы можете сделать это inline, если JSON всегда гарантированно будет последней частью файла.

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

  • 0
    Спасибо! На самом деле реальный сценарий использования немного сложен, хотя я просто хочу быть ленивым, который не хочет найти оригинальный файл json: D
  • 0
    Это не будет работать, если объект JSON содержит неравные числа строковых литералов { и } .
Показать ещё 2 комментария

Ещё вопросы

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