簡體   English   中英

在python中將單引號替換為雙引號,以便與插入數據庫一起使用

[英]Replace single quotes with double quotes in python, for use with insert into database

想知道是否有人有一個聰明的解決方案來修復由不太聰明的程序導出的Python中的錯誤插入語句。 它沒有為字符串添加兩個單引號,並且在字符串中添加了單引號。 為了更容易一點,所有要插入的值都是字符串。

因此它具有:

INSERT INTO addresses VALUES ('1','1','CUCKOO'S NEST','CUCKOO'S NEST STREET');

代替:

INSERT INTO addresses VALUES ('1','1','CUCKOO''S NEST','CUCKOO''S NEST STREET');

顯然,有很多行,而且我也不想替換封閉的單引號。

曾經考慮使用split和join,但是我不確定在循環時如何輕松地更新split值。 抱歉,我是菜鳥。 如下所示,我不確定如何執行#update位

import sys

fileIN = open('a.sql', "r")
line = fileIN.readline()

while line:
   bits = line.split("','")
   for bit in bits:
      if bit.find("'") > -1:
         #update bit
   line_out = "','".join(bits)      
   sys.stdout.write(line_out)
   line = fileIN.readline()

謝謝

根據katrielalex的建議,如何處理:

>>> import re
>>> s = "INSERT INTO addresses VALUES ('1','1','CUCKOO'S NEST','CUCKOO'S NEST STREET');"
>>> def repl(m):
    if m.group(1) in ('(', ',') or m.group(2) in (',', ')'):
        return m.group(0)
    return m.group(1) + "''" + m.group(2)

>>> re.sub("(.)'(.)", repl, s)
"INSERT INTO addresses VALUES ('1','1','CUCKOO''S NEST','CUCKOO''S NEST STREET');"

如果您對斷言的看法感到反感,那就是令人頭痛的純正則表達式版本:

re.sub("((?<![(,])'(?![,)]))", "''", s)
while line:
    # Restrain line2 to inside parentheses
    line1, rest = line.split('(')
    line2, line3 = rest.split(')')
    # A bit more cleaner
    new_bits = []
    for bit in line2.split(','):
        # Remove border ' characters
        bit = bit[1:-1]
        # Duplicate the ones inside
        if "'" in bit:
            bit = bit.replace("'", "''")
        # Re-add border '
        new_bits.append("'" + bit + "'")
   sys.stdout.write(line1 + '(' + ','.join(new_bits + ')' + line3)
   line = fileIN.readline()

警告:這取決於太多的SQL語句的格式。 但是,如果您的輸入僅具有“語句(參數)結尾”格式,則每次都可以使用。

import sys

fileIN = open('a.sql', "r")
line = fileIN.readline()

while line:
    #split out the parameters (between the ()'s)
    start, temp = line.split("(")
    params, end = temp.split(")")

    #replace the "'"s in the parameters (without the start and end quote)
    newParams = "','".join([x.replace("'", "''") for x in params[1:-1].split("','")])

    #join the statement back together
    line_out = start + "('" + newParams + "')" + end

    #next line
    sys.stdout.write(line_out)
    line = fileIN.readline()

說明:

  1. 將字符串分為3部分:查詢開始,參數和結束。
  2. 生成器獲取參數(不包含開始/結尾' s),將其分割為',' ,然后,對於分割生成的列表中的每個元素(各個數據條目),將“ '替換為''
  3. 然后,最后一行將查詢的開頭,新的參數(帶括號和引號的先前已刪除)和語句的末尾連接起來。

另一個答案:

a = "INSERT INTO addresses VALUES ('1','1','CUCKOO'S NEST','CUCKOO'S NEST STREET');"
open_par = a.find("(")
close_par = a.find(")")
b = a[open_par+1:close_par]
c = b.split(",")
d = map(lambda x: '"' + x.strip().strip("'") + '"',c)
result = a[:open_par+1] + ",".join(d) + a[close_par:]

與:

import sys
import re

def repl(m):
    if m.group(1) in ('(', ',') or m.group(2) in (',', ')'):
        return m.group(0)
    return m.group(1) + "''" + m.group(2)

fileIN = open('a.sql', "r")
line = fileIN.readline()

while line:
    line_out = re.sub("(.)'(.)", repl, line)
    sys.stdout.write(line_out)
    # Next line.
    line = fileIN.readline()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM