Почему мои данные l oop несколько раз, когда я создал словарь? - PullRequest
1 голос
/ 31 января 2020

Первый шаг начинается с получения данных из mysql. Затем я сделаю проверку орфографии со словарем, который я создал. Наконец, вставьте вывод в mysql. Проблема в том, что у меня выходной цикл несколько раз. Надеюсь, вы мне поможете

Мой код:

app.py

from dic import dikk

cur.execute("SELECT a FROM table WHERE id=%s", [id])

data = cur.fetchall()


for row in data:


    for k, v in dikk.items():
        t = re.compile(re.escape(k), re.IGNORECASE)
        row['a'] = t.sub(v, row['a'])
        print(row['a'])



        mySql_insert_query = """INSERT INTO table2 (a) VALUES (%s)"""
        records_to_insert =[(row['a'])]

        cur = mysql.connection.cursor()

        cur.execute(mySql_insert_query, records_to_insert)

       # Commit to DB
        mysql.connection.commit()

di c .py

dikk={'speling':'spelling','writen':'written','Jhon':'John'}

Вывод, который я получил:

it is not Jhon
it is not Jhon
it is not John

Мой желаемый вывод:

it is not John

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Вы перебираете словарь с 3 парами значений ключа и вызываете print и insert для каждого l oop, вызывая его срабатывание 3 раза.

Если вы переместили свои вызовы на insert и print вне l oop, у вас будет один возврат на элемент.

dikk={'speling':'spelling','writen':'written','Jhon':'John'}

data = [('it is not Jhon',), ('you spell it speling',), ('writen is the way',)]

for idx, value in enumerate(data):
    for word in value[0].split(" "):
        if word in dikk.keys():
            data[idx] = data[idx][0].replace(word, dikk[word])

    # Insert can go here    
for row in data:
    print(row)
    # Or insert can go here

#it is not John
#you spell it spelling
#written is the way

Вы можете добавить свой insert в каждую строку в data, или вы можете вставить его отдельно позже, перебирая список data снова.

0 голосов
/ 31 января 2020

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

И вы можете вызвать mysql.connection.commit() только один раз после обработки всех строк, это не обязательно должно быть в l oop.

row['a'] должно быть row[0], поскольку fetchall() возвращает список кортежей, а не словарей.

for row in data:
    for k, v in dikk.items():
        t = re.compile(re.escape(k), re.IGNORECASE)
        row[0] = t.sub(v, row[0])
    print(row[0])
    mySql_insert_query = """INSERT INTO table2 (a) VALUES (%s)"""
    cur.execute(mySql_insert_query, (row[0],))
mysql.connection.commit()

Также возможно выполнить все замены одним вызовом до re.sub(), а не oop. Преобразуйте все ключи в регулярное выражение, например key1|key2|key3|..., и используйте функцию для получения замены из словаря.

t = re.compile("|".join(re.escape(k) for k in dikk))
row['a'] = t.sub(lambda m: dikk[m.group(0)], row['a']
...