处理文本文件中的单引号

我有一个纯文本文件,由~


20-07-31-03:00~[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]

下面的脚本接收损坏的数组如下


with open('''/etc/files/plaintext.txt''') as f:

    resultCollect = f.read().splitlines() 

    resultSplit.append([line.split('~') for line in resultCollect])

    insert(resultSplit[0], table)


# resultSplit[0] --> ['20-07-31-03:00','[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]']


def insert(data, table):


    val = [tuple(line) for line in data]

    for i in range(len(val)):

        cur.execute("""INSERT INTO {0} VALUES {1}""".format(table, tuple(val[i])))

但是,由于 中的字符串内有单引号'DB_CONTENT',在尝试向数据库中插入时,会产生以下错误


column "[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]" does not exist

生成的插入示例


INSERT INTO tbl_details VALUES ('20-07-30-01:53', "[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]")

可重现的例子:


result = []

val = '''20-07-31-03:00~[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]'''

result.append([val.split('~')])


def insert(data, table):


  val = [tuple(line) for line in data]

  for i in range(len(val)):

    print("""INSERT INTO {0} VALUES {1}""".format(table, tuple(val[i])))


insert(result[0], 'tbl_name')

任何解决方案的建议?


心有法竹
浏览 90回答 1
1回答

慕标5832272

你永远不应该自己格式化 SQL 查询:永远,永远,永远不要使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。甚至没有在枪口下。从文档示例中可以看出,首选方法是让库处理它。SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotesdata = ("O'Reilly", )cur.execute(SQL, data) # Note: no % operator这应该可以正确处理用单引号转义您的字符串。编辑:在您的代码中添加示例。上面建议的方式不应该用于插入表名(INSERT INTO %s),它应该只用于数据部分(VALUES (%s))EDIT2:没有注意到你想插入两个值'20-07-30-01:53', "[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]"。我已经编辑了代码,请注意%s查询字符串中的附加内容。此外,我真的看不出val[i]包含什么,但它应该是您要插入的两个值的序列(元组、列表)。from psycopg2.sql import SQL, IdentifierSQL_QUERY_STRING = """INSERT INTO {} VALUES (%s, %s)"""def insert(data, table):    val = [tuple(line) for line in data]    for i in range(len(val)):        curr.execute(            SQL(SQL_QUERY_STRING).format(Identifier(table)),            val[i],            # second (data) argument has to be a sequene (tuple, list, ...)            # of values to be inserted, even if it's just one value        )
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python