0

...しかし、同じ方法で2回エスケープするわけではありません。

gpgからWebサイトにASCII出力をアップロードしようとしています。したがって、これまでのところ、私が取得したビットは、テーブルにクエリを実行し、取得したデータを表示し、HTTPPOSTリクエスト用にエンコードした後に表示します。

cnx = connect()
sql = ("SELECT Data FROM SomeTable")
cursor = cnx.cursor()
cursor.execute(sql)
for (data) in cursor:
        print "encoding : %s" % data
        postdata = urllib.urlencode( { "payload" : data } ) 
        print "encoded as %s" % postdata

...しかし、私が得るものは次のとおりです。

encoding : -----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.12 (GNU/Linux)
.... etc...

encoded as payload=%28u%27-----BEGIN+PGP+MESSAGE-----%5CnVersion%3A+GnuPG+v1.4.12+... etc ...

注意すべき部分は、私が期待するように、改行が%0Aに変換されていないことです。代わりに、それらはどういうわけか「\ n」にエスケープされ、次に円記号は%5Cにエスケープされるため、改行は「%5Cn」になります。さらに奇妙なことに、データには%28u%27が付加され、「(u'」になります。

奇妙なことに、私が基本的なテストを行う場合:

data = "1\n2"
print data
print urllib.urlencode( { "payload" : data } )

私は期待するものを手に入れました、改行は%0Aに変わります...

1
2
payload=1%0A2

したがって、私の予感は、mysqlクエリから返されるデータ要素が私の文字列 "1 \ n2"(おそらく1要素のdict ... dunno)と同じ種類の文字列ではないということですが、私は持っていませんそれを検査する方法を知るためのPythonカンフー。

誰もがここで何が起こっているのか、そしてどうすればそれを修正できるのか知っていますか?そうでない場合は、すべてを適切にエスケープしてHTTP経由でこれをPOSTする方法についての提案はありますか?

4

1 に答える 1

0

一部のDB-API2.0互換データベースインターフェイス(組み込みまたは最も一般的なインターフェイスなど)connect()の関数であると想定すると、文字列ではなくオブジェクトを反復処理します。sqlite3mysqlfor (data) in cursor:Row

あなたがそれを印刷するとき、あなたは効果的に印刷しています(それをフォーマットstr(data)に渡すことによって)。%s同じものをエンコードしたい場合は、をエンコードする必要がありますstr(data)

ただし、それを行うためのより良い方法は、必要なことを実行することに依存するのではなく、最初に行を(1つの列の)行として処理するstrことです。

dataPS、各行の最初の要素を作成するためにタプルのアンパックに依存しようとした場合、それは間違っています。

for (data) in cursor:

…と同じです:

for data in cursor:

1つの要素tupleが必要な場合は、コンマが必要です。

for data, in cursor:

(必要に応じて親を追加することもできますが、どちらの方法でも違いはありません。)

具体的には、カーソルを繰り返すと、オプションの__iter__メソッドが呼び出され、カーソル自体が返されます。次に、カーソル自体のメソッドがループ呼び出しされます。これは、結果セットがなくなるまでnext呼び出すのと同じことを行い、「単一のシーケンス」を返すように文書化されています。タイプが定義されていません。ほとんどの実装では、これはのような特別な行タイプであり、まるでそれであるかのようにアクセスできますが、表形式での印刷、名前によるアクセスの許可などの特別なセマンティクスがあります。fetchone()fetchonesqlite3.Rowtuple

于 2013-02-26T20:16:36.637 に答える