Bagaimana cara mengubah kamus menjadi string kueri dengan Python?


Jawaban:


158

Python 3

urllib.parse.urlencode(kueri, dosisq = Salah, [...])

Mengonversi objek pemetaan atau urutan tupel dua elemen, yang mungkin berisi objek str atau byte, menjadi string teks ASCII berenkode persen.

- Python 3 urllib.parsedokumen

A dictadalah pemetaan.

Python lama

urllib.urlencode( query[, doseq])
Mengonversi objek pemetaan atau urutan tupel dua elemen menjadi string "berenkode persen" ... serangkaian key=valuepasangan yang dipisahkan oleh '&'karakter ...

- Python 2.7 urllibdokumen


1
Ini benar, tetapi yang dictdikembalikan oleh cgi.parse_qs()sebenarnya memiliki lists sebagai "nilai" -nya. Meneruskan langsung ini akan menghasilkan string kueri yang tampak sangat aneh.
Johnsyweb

Cukup benar. Itu akan mengajari saya untuk membaca lebih dari kalimat pertama!
Johnsyweb


Masalahnya adalah urlencode akan mengubah spasi menjadi +, yang tidak disarankan.
pengguna1633272

1
@ user1633272: Tidak direkomendasikan menurut siapa?
Ignacio Vazquez-Abrams

66

Di python3, sedikit berbeda:

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

keluaran: 'pram1=foo&param2=bar'

untuk kompatibilitas python2 dan python3, coba ini:

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

7

Anda sedang mencari sesuatu yang persis seperti urllib.urlencode()!

Namun, saat Anda memanggil parse_qs()(berbeda dari parse_qsl()), kunci kamus adalah nama variabel kueri unik dan nilainya adalah daftar nilai untuk setiap nama.

Untuk meneruskan informasi ini urllib.urlencode(), Anda harus "meratakan" daftar ini. Berikut adalah bagaimana Anda dapat melakukannya dengan pemahaman daftar tupel:

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

16
Atau Anda bisa lewat doseq=True.
Ignacio Vazquez-Abrams

@ downvoter: Bagaimana saya dapat meningkatkan jawaban ini? Sudah enam tahun sejak saya menulisnya!
Johnsyweb

-1

Mungkin Anda sedang mencari sesuatu seperti ini:

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

Dibutuhkan kamus dan mengubahnya menjadi string kueri, seperti urlencode. Ini akan menambahkan akhir "&" ke string kueri, tetapi return query[:-1]memperbaikinya, jika itu menjadi masalah.


4
Apakah Anda bertemu str.join()belum? Bagaimana dengan urllib.quote_plus()?
Ignacio Vazquez-Abrams

1
@ Garbados Solusi Anda harus bekerja dalam kasus-kasus sederhana. Namun, lihat urlencodedi urllib.py(harus dalam instalasi Python Anda) untuk melihat mengapa membuat string kueri terkadang tidak sesederhana jawaban Anda (khususnya kebutuhan untuk 'mengutip' karakter tertentu yang tidak valid dalam URL). @Ignacio juga mereferensikan dua fungsi yang akan membersihkan implementasi Anda dan membuatnya benar.
Anthony Cramp

Ah, memang. Maaf atas penerapannya yang kasar. Ini menunjukkan bahwa saya harus lebih berhati-hati menjawab pertanyaan yang tidak pernah saya hadapi sendiri.
garbados

Meskipun ini mungkin bukan jawaban terbaik, namun inilah yang ingin saya lihat ketika saya mengklik judul pertanyaan ini. Saya hanya memiliki 4 item dalam sebuah dict yang perlu saya ubah menjadi pasangan name = value yang dipisahkan oleh '&'. Nilai-nilai saya dikendalikan. Str.join () berguna dalam kasus saya, tetapi saya tidak memerlukan quote_plus (), sekali lagi, karena ini bukan kode yang dapat dilihat publik :) Terima kasih!
harperville

1
@harperville tetapi cara yang lebih benar ( from urllib.parse import urlencode; urlencode(your_dict)) lebih pendek dan lebih mudah dari ini! Saya akan mengakui bahwa terkadang cerdas untuk menemukan kembali roda, bahkan dengan buruk, ketika mahal atau tidak nyaman untuk mengakses roda yang ada dan dirancang dengan baik, tetapi di sini menggunakan roda off-the-shelf lebih mudah dan lebih cepat daripada memutar roda inferior Anda sendiri .
Mark Amery
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.