Bagaimana cara mengubah kamus menjadi string kueri dengan Python?
113
Setelah menggunakan cgi.parse_qs(), bagaimana cara mengubah hasil (kamus) kembali ke string kueri? Mencari sesuatu yang mirip dengan urllib.urlencode().
urllib.urlencode( query[, doseq])
Mengonversi objek pemetaan atau urutan tupel dua elemen menjadi string "berenkode persen" ... serangkaian key=valuepasangan yang dipisahkan oleh '&'karakter ...
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!
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)
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.
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 .
cgi.parse_qs()
tidak digunakan lagi. Gunakan urlparse.parse_qs () sebagai gantinya.Jawaban:
Python 3
A
dict
adalah pemetaan.Python lama
sumber
dict
dikembalikan olehcgi.parse_qs()
sebenarnya memilikilist
s sebagai "nilai" -nya. Meneruskan langsung ini akan menghasilkan string kueri yang tampak sangat aneh.Di python3, sedikit berbeda:
keluaran:
'pram1=foo¶m2=bar'
untuk kompatibilitas python2 dan python3, coba ini:
sumber
Anda sedang mencari sesuatu yang persis seperti
urllib.urlencode()
!Namun, saat Anda memanggil
parse_qs()
(berbeda dariparse_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:sumber
doseq=True
.Mungkin Anda sedang mencari sesuatu seperti ini:
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.sumber
str.join()
belum? Bagaimana denganurllib.quote_plus()
?urlencode
diurllib.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.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 .