Преобразование строки dict в список словаря для вставки в mongodb - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть строковые данные (dict_string), как показано ниже, не разделенные запятой или чем-то еще, но каждая строка заканчивается \ n:

data = {"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109897,"Title":"Prop 1","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: Some title data might me data \n  some link http:\\www.ggogle\.com with some sepcial characters >< ? // ","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"}\n
       {"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109890,"Title":"Prop 2","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: Some title data might me data \n  some link http:\\www.ggogle\.com with some sepcial characters >< ? //","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"}\n

Я хочу преобразовать это в список словаря как:

[{"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109897,"Title":"Prop 1","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: Some title data might me data \n  some link http:\\www.ggogle\.com with some sepcial characters >< ? // ","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"},
{"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109890,"Title":"Prop 2","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: Some title data might me data \n  some link http:\\www.ggogle\.com with some sepcial characters >< ? //","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"}]

чтобы я мог вставить это в mongodb.

Я попытался заменить, а затем разделить, как показано ниже

data = data.replace("\n{", "|{")
data = data.split("|")

но это генерирует список строк, оканчивающихся на \ n что-то вроде этого: ['{}', '{}' ..., \ n]

Eval выбрасывает строковые литералы.

Как мне этого добиться? В любом случае я могу использовать JSON нагрузки или что-то

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я думаю, что вы почти получили ответ, вы могли бы сделать это, проверив строку и заменив "\ n", удачи.

import ast
data = data.replace("\n{", "|{")
[ast.literal_eval(line.replace("\n", " ")) for line in data.split("|") if line]
0 голосов
/ 13 сентября 2018

Использование Regex с модулем ast.

Пример:

import re
import ast

data = '''{"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109897,"Title":"Prop 1","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: Some title data might me data \n  some link http:\\www.ggogle\.com with some sepcial characters >< ? // ","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"}
       {"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109890,"Title":"Prop 2","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: Some title data might me data \n  some link http:\\www.ggogle\.com with some sepcial characters >< ? //","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"}'''

for i in re.findall(r"\{.*?\}", data.replace('\r', '').replace('\n', ''), flags=re.DOTALL):
    print(ast.literal_eval(i))

Выход:

{'Date1': '2017-02-13T00:00:00.000Z', 'Temp Predicted': 3.9, 'Temp': 5, 'Title': 'Prop 1', 'Level': 'Medium', 'PID': 109897, 'createdtime': '2017-02-12T15:24:38.380Z', 'Temp Actual': 5, 'Explaination': 'Source: Some title data might me data   some link http:\\www.ggogle\\.com with some sepcial characters >< ? // ', 'creator': '\\etc\\someid', 'peerval': '222.22000'}
{'Date1': '2017-02-13T00:00:00.000Z', 'Temp Predicted': 3.9, 'Temp': 5, 'Title': 'Prop 2', 'Level': 'Medium', 'PID': 109890, 'createdtime': '2017-02-12T15:24:38.380Z', 'Temp Actual': 5, 'Explaination': 'Source: Some title data might me data   some link http:\\www.ggogle\\.com with some sepcial characters >< ? //', 'creator': '\\etc\\someid', 'peerval': '222.22000'}

или

print([ast.literal_eval(i) for i in re.findall(r"\{.*?\}", data.replace('\r', '').replace('\n', ''), flags=re.DOTALL)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...