Pythonで辞書をクエリ文字列に変換する方法は?


回答:


158

Python 3

urllib.parse.urlencode(クエリ、doseq = False、[...])

変換マッピングオブジェクトまたはSTRを含むまたはパーセントエンコードASCIIテキスト文字列に、オブジェクトをバイトできる2要素タプルのシーケンスを、。

Python 3 urllib.parseドキュメント

A dictはマッピングです。

レガシーPython

urllib.urlencodequery[、doseq])マッピングオブジェクトまたは2要素のタプルのシーケンスを「パーセントエンコードされた」文字列に
変換...文字で区切られた一連のペア...key=value'&'

Python 2.7 urllibドキュメント


1
これは本当ですが、実際dictにによって返されるのcgi.parse_qs()list「値」としてsを持っています。これらをそのまま渡すと、クエリ文字列が非常に奇妙に見えます。
Johnsyweb、2011年

十分だ。それは私が最初の文以上を読むことを教えてくれるでしょう!
Johnsyweb


問題は、urlencodeがスペースを+に変換することです。これはお勧めできません。
user1633272

1
@ user1633272:誰のために推奨されていませんか?
イグナシオバスケスエイブラムス

65

python3では、少し異なります:

from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})

出力: 'pram1=foo&param2=bar'

python2とpython3の互換性のために、これを試してください:

try:
    #python2
    from urllib import urlencode
except ImportError:
    #python3
    from urllib.parse import urlencode

6

あなたはまさに同じようなものを探していますurllib.urlencode()

ただし、呼び出すときparse_qs()(から区別)parse_qsl())と、ディクショナリキーは一意のクエリ変数名になり、値は各名前の値のリストになります

この情報をに渡すにはurllib.urlencode()、これらのリストを「フラット化」する必要があります。タプルのリスト包括を使用してこれを行う方法は次のとおりです。

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)

15
または、合格できますdoseq=True
Ignacio Vazquez-Abrams

@downvoter:どうすればこの答えを改善できますか?書いてから6年になります!
Johnsyweb 2017年

-1

多分あなたはこのようなものを探しています:

def dictToQuery(d):
  query = ''
  for key in d.keys():
    query += str(key) + '=' + str(d[key]) + "&"
  return query

ディクショナリを受け取り、urlencodeと同様にクエリ文字列に変換します。クエリ文字列に最後の「&」を追加しますがreturn query[:-1]、問題がある場合は修正します。


4
もう会ったstr.join()?いかがurllib.quote_plus()ですか?
Ignacio Vazquez-Abrams、

1
@garbadosソリューションは単純なケースで機能するはずです。しかし、見ていurlencodeurllib.pyあなたの答えは、特に(Aには有効ではありません「引用」特定の文字への必要性を暗示するように、クエリ文字列を作成することはありません非常に簡単と時々ある理由を確認するために(それはあなたのPythonででインストールする必要がありますが) URL)。@Ignacioは、実装をクリーンアップして正しいものにする2つの関数も参照しています。
Anthony Cramp、2011年

ああ、確かに。ぎこちない実装でごめんなさい。私は自分自身に直面したことがない質問にもっと注意深く答えるべきであることを示しに行きます。
ガルバドス2010年

これは最善の答えではないかもしれませんが、この質問のタイトルをクリックしたときにまさに私が見たかったものです。'&'で区切られたname = valueのペアに変換する必要があるdictに4つのアイテムしかない。私の価値観は管理されています。str.join()は私の場合は便利ですが、公向けのコードではないため、再度quote_plus()を使用する必要はありません:)ありがとうございます!
harperville 14

1
@harpervilleですが、より正確な方法(from urllib.parse import urlencode; urlencode(your_dict))はこれよりも短くて簡単です!既存の適切に設計されたホイールにアクセスするのが高価または不便な場合は、粗雑にでも、ホイールを再発明するのが賢いこともありますが、ここでは既製のホイールを使用する方が、自分の劣ったホイールを転がすよりも簡単で迅速です。 。
Mark Amery 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.