Bagaimana saya bisa mengubah str
representasi a dict
, seperti string berikut, menjadi a dict
?
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Saya lebih suka tidak menggunakan eval
. Apa lagi yang bisa saya gunakan?
Alasan utama untuk ini, adalah salah satu kelas rekan kerja saya yang ia tulis, mengubah semua input menjadi string. Saya tidak berminat untuk pergi dan memodifikasi kelasnya, untuk menangani masalah ini.
python
string
dictionary
UberJumper
sumber
sumber
"
null
true
false
None
True
False
Jawaban:
Mulai dengan Python 2.6 Anda bisa menggunakan built-in
ast.literal_eval
:Ini lebih aman daripada menggunakan
eval
. Seperti dokumen sendiri katakan:Sebagai contoh:
sumber
"dict(a=1)"
gaya string?https://docs.python.org/3.8/library/json.html
JSON dapat memecahkan masalah ini meskipun dekoder ingin tanda kutip ganda di sekitar kunci dan nilai. Jika Anda tidak keberatan peretasan ganti ...
Perhatikan bahwa jika Anda memiliki tanda kutip tunggal sebagai bagian dari kunci atau nilai Anda, ini akan gagal karena penggantian karakter yang tidak benar. Solusi ini hanya disarankan jika Anda memiliki keengganan yang kuat terhadap solusi eval.
Lebih lanjut tentang json single quote: jQuery.parseJSON melempar kesalahan "JSON Tidak Sah" karena lolos dari penawaran tunggal di JSON
sumber
{"foo": "b'ar"}
{'foo': (1, 2, 3)}
+1
untuk menginformasikan bahwa decoder menginginkan tanda kutip ganda di sekitar kunci dan nilai."{0: 'Hello'}"
.menggunakan
json.loads
:sumber
Untuk contoh OP:
Kita dapat menggunakan Yaml untuk menangani json non-standar semacam ini dalam string:
sumber
Jika string selalu dapat dipercaya, Anda dapat menggunakan
eval
(atau menggunakanliteral_eval
seperti yang disarankan; aman apa pun string itu.) Jika tidak, Anda memerlukan parser. Pengurai JSON (seperti simplejson) akan berfungsi jika ia hanya pernah menyimpan konten yang sesuai dengan skema JSON.sumber
Gunakan
json
. yangast
perpustakaan mengkonsumsi banyak memori dan dan lebih lambat. Saya memiliki proses yang perlu membaca file teks 156Mb.Ast
dengan 5 menit keterlambatan untuk kamus konversijson
dan 1 menit menggunakan 60% lebih sedikit memori!sumber
Untuk meringkas:
Hasil:
Kesimpulan: lebih suka json.loads
sumber
sumber
{
atau}
. Bagaimana jika itu bersarangdict
. Bagaimana jika nilainya mengandung,
??tidak ada lib yang digunakan:
CATATAN: Karena hardcoded
split("'")
hanya akan berfungsi untuk string di mana data "dikutip tunggal".sumber