在python中用双引号替换单引号,以便与insert into database一起使用

2024-06-09 08:06:27 发布

您现在位置:Python中文网/ 问答频道 /正文

想知道是否有人有一个聪明的解决办法来修复坏的 在Python中插入语句,由一个不太聪明的程序导出。它没有增加 字符串中有一个单引号的字符串有两个单引号。到 更简单一点,所有插入的值都是字符串。在

所以它有:

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

而不是:

^{pr2}$

很明显这里面有很多行,我不想替换 后面的单引号也是。在

正在考虑使用split和join,但我不确定如何在循环中循环时轻松地更新split值。对不起,我是个笨蛋。像下面这样,我不知道如何更新位

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()

谢谢


Tags: 字符串readlinesyslinebit语句outbits
3条回答

警告:这在很大程度上取决于SQL语句的格式。但是,如果您的输入只使用“statements(params)end”格式,那么每次都可以使用。在

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),在','上拆分,并且,对于拆分生成的列表中的每个元素(单独的数据项),将{}s替换为{}s
  3. 最后一行连接查询开始、新参数(带有先前删除的括号和引号)和语句的结尾。在

根据Katrielex的建议,这个怎么样:

>>> 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');"

如果你对否定的lookbehind断言感兴趣,这是一个令人头痛的纯正则表达式版本:

^{pr2}$
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()

相关问题 更多 >