У меня есть txt файл, содержащий простой текст и текстовый блок в стиле json. Я хочу проанализировать txt и извлечь блок json для объекта python dict.
Например, txt файл может выглядеть так:
1234567
asdfjkl
{
"Name": {
"given ": "kevin"
},
"info": [
"asdf",
"fda",
"sdf"
]
}
и там есть один и только один законный блок json в каждом txt. Не удалось найти что-либо в пакете json
. Любая помощь будет оценена.
Как вы сказали, 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']}
Если вы контролируете ввод, не делайте этого так. Если парень или парень на входном конце - клиент/босс, проклинайте богов кода под вашим дыханием и напишите вспомогательную функцию следующим образом:
# 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.
{
и }
.