私はあらゆる種類のPythonモジュールを試しましたが、エスケープしすぎるか、間違った方法でエスケープします。Pythonで引用符( "、')をエスケープするために見つけた最良の方法は何ですか?
9 に答える
データベースクエリの一部である場合は、パラメータ化されたSQLステートメントを使用できるはずです。
引用符をエスケープするだけでなく、これはすべての特殊文字を処理し、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'
奇妙なハックはありません。組み込みで、ほとんどの目的で機能します。
psycopg2を使用する場合、そのexecute()
メソッドにはエスケープが組み込まれています。
cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))
Pythonの%演算子を使用して文字列を変更する代わりに、メソッドを実行するための2つの引数(文字列とタプル)を指定していることに注意してください。
ここから盗まれた答え:mysqldb.escape_stringに相当するpsycopg2?
トリプル一重引用符は、SQLクエリでよく使用される一重引用符を便利にカプセル化します。
c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''')
文字列をエスケープするメソッドを持つpsycopg2を使用している場合:完全な答えについては、文字列値を明示的に引用する方法(Python DB API / Psycopg2)psycopg2.extensions.adapt()
を参照してください。
エスケープするには、トリプルダブルクォートが最適です。
string = "" "これは、「一重引用符」、「二重引用符」、 およびリテラルEOLはすべて同じ文字列に含まれます。"" "
より一般的な問題の解決策として、タブ区切りのフラットファイルに文字のセットを格納する必要があるプログラムがあります。明らかに、「セット」にタブがあると問題が発生していました。
output_f.write(str)の代わりに、output_f.write(repr(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ステートメントをでラップした後に使用することに気付くでしょう'''