Разделение строки в Python с многократным появлением ключевого слова split - PullRequest
0 голосов
/ 30 августа 2018

Итак, я хочу разделить фильтр и обновить параметр для MongoDB вместо одного метода, доступного в библиотеке Pymongo.

{filter}, {update}

передается мне из файла, одна пара на строку

Например: {"k1":"v1"}, {"k1":"v1", "k2":"v2", "k3":"v3"}

Что я хочу сделать?

Разделите их так, чтобы я получил две переменные dict,

filter = {"k1":"v1"}
update = {"k1":"v1", "k2":"v2", "k3":"v3"}

Что я пробовал?

Проблема в том, что я не хочу менять исходный формат, и если я разделю их, используя «,», то это может внезапно разделиться, я также не могу рассчитывать на разделение при первом появлении «,», поскольку сама часть фильтра может иметь несколько ","

def data_replace_one(host, port, dbname, coll_name, file_path, authdb):

    if LOCALHOST:
        client = pymongo.MongoClient(host, port)       
    else:
        print("Enter credentials:")
        uname = input("Username: ")
        pwd = getpass.getpass()

        client = pymongo.MongoClient(
            host, port, username=uname, password=pwd, authSource=authdb)

    db = client[dbname]
    coll = db[coll_name]

    with open(file_path) as in_file:
        list_dict_queries = [line.strip() for line in in_file]

    list_dict_queries = list(filter(None, list_dict_queries))

    for query in list_dict_queries:
        query_list = query.split("|")
        query_list[0] = query_list[0].strip()
        query_list[1] = query_list[1].strip()
        #print(literal_eval(query_list[0]), literal_eval(query_list[1]))
        coll.replace_one(literal_eval(
            query_list[0]), literal_eval(query_list[1]))

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

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

>>> filter, update = re.findall('{.*?}', '{"k1":"v1"}, {"k1":"v1", "k2":"v2", "k3":"v3"}')

>>> filter
'{"k1":"v1"}'

>>> update
'{"k1":"v1", "k2":"v2", "k3":"v3"}'
0 голосов
/ 30 августа 2018

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

Что-то вроде:

import json

with open(file_path) as in_file:
    list_dict_queries = [('[' + line.strip() + ']') for line in in_file]

query_list = [json.loads(n) for n in list_dict_queries]
...