我尝试了各种 Python 模块,但它们要么逃逸太多,要么以错误的方式逃逸。您发现在 Python 中转义引号 (", ') 的最佳方法是什么?
9 回答
如果它是数据库查询的一部分,您应该能够使用Parameterized SQL Statement。
除了转义引号外,这还将处理所有特殊字符并保护您免受SQL 注入攻击。
使用json.dumps
.
>>> import json
>>> print json.dumps('a"bc')
"a\"bc"
转义字符串并将其他对象转换为编程形式的简单且标准的方法是使用内置repr()
函数。它将对象转换为您需要使用手动代码输入的表示形式。
例如:
s = "I'm happy I am \"here\" now"
print repr(s)
>> 'I\'m happy I am "here" now'
没有奇怪的黑客,它是内置的,它只适用于大多数目的。
三重单引号将方便地封装 SQL 查询中经常使用的单引号:
c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''')
如果使用 psycopg2,它的execute()
方法有内置的转义:
cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))
请注意,您为执行方法(字符串和元组)提供了两个参数,而不是使用 Python 的 % 运算符来修改字符串。
从这里偷来的答案:psycopg2 相当于 mysqldb.escape_string?
如果您使用的 psycopg2 具有转义字符串的方法:psycopg2.extensions.adapt()
请参阅如何显式引用字符串值 (Python DB API/Psycopg2)以获得完整答案
三双引号最适合转义:
string = """这将跨越“单引号”、“双引号”、 和文字 EOL 都在同一个字符串中。"""
对于更通用的问题的解决方案,我有一个程序,我需要将任何字符集存储在一个平面文件中,制表符分隔。显然,在“集合”中有标签会导致问题。
我使用了 output_f.write(repr(str)) 而不是 output_f.write(str),这解决了我的问题。阅读速度较慢,因为我在阅读时需要 eval() 输入,但总的来说,它使代码更清晰,因为我不再需要检查边缘情况。
对于我的用例,我在数据库中保存了一个段落,在该段落的某个地方可能有一些带有单引号的文本(example: Charlie's apple sauce was soggy)
我发现这个效果最好:
database_cursor.execute('''INSERT INTO books.collection (book_name, book_quoted_text) VALUES ('%s', "%s")''' % (book_name, page_text.strip()))
您会注意到我""
在将 INSERT 语句包装后使用'''