Bir piton diktini bir dizgiye ve geriye dönüştürme


275

Bir sözlük nesnesine veri depolayan bir program yazıyorum, ancak bu verilerin program yürütme sırasında bir noktada kaydedilmesi ve program yeniden çalıştırıldığında sözlük nesnesine geri yüklenmesi gerekir. Sözlük nesnesini bir dosyaya yazılabilen ve sözlük nesnesine geri yüklenebilen bir dizeye nasıl dönüştürebilirim? Bu, umarım sözlük içeren sözlükleri destekleyecektir.

Yanıtlar:


274

Json modülü burada iyi bir çözümdür. Turşuya göre sadece düz metin çıktısı üretme avantajı vardır, çapraz platform ve çapraz versiyondur.

import json
json.dumps(dict)

2
Bu modüle de bir göz atacağım. Hem json hem de turşu kullanımı kolay görünüyor, bu yüzden çapraz platform desteği gibi şeylere inecek. Teşekkürler
AJ00200 28:10

5
Turşu, bu noktada onaylanmamış olarak görülme eğilimindedir. Böyle şeyler için daima json kullanırım. (Nispeten) insan tarafından okunabilir olmak BÜYÜK bir artıdır.
Tyler Eaves

30
Kullanıcıların bunu nasıl yapacağını görmelerine izin vermek için basit bir örnek eklemelisiniz.
Miguel Vazq

1
@TylerEaves Nasıl yapılması gerektiği konusunda örnek verebilir misiniz?
Boban

1
: foreheadslap: yaptığım import jsongibi unutma !
Jesse Chisholm

207

Sözlüğünüz çok büyük değilse str + eval işi yapabilir:

dict1 = {'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }}
str1 = str(dict1)

dict2 = eval(str1)

print dict1==dict2

Kaynağa güvenilmezse ek güvenlik için eval yerine ast.literal_eval kullanabilirsiniz .


13
Gerçekten bu koda tanıtmak olası istismarlarla başa çıkmak için hazır değilim. Ben json veya turşu sorunları olabilir bilmiyorum, ama ben bu durumda eval tehlikeli olacak bir gerçeği biliyorum.
AJ00200

5
@ AJ00200: ve bahsettiğim ast.literal_eval alternatifi ?. Python yardımından: "Bir ifade düğümünü veya bir Python ifadesi içeren bir dizeyi güvenle değerlendirin. Sağlanan dize veya düğüm yalnızca şu Python değişmez yapılarından oluşabilir: dizeler, sayılar, tuples, listeler, dikteler, booleans ve Yok. güvenilir olmayan kaynaklardan gelen Python ifadelerini içeren dizeleri, değerleri ayrıştırmaya gerek kalmadan güvenle değerlendirmek için kullanılabilir. "
PabloG

Yararlı görünüyor, ancak daha önce bu verileri işlemek için SQLite kullanırken ve 1500'den fazla girişi vardı, bu yüzden her zaman oldukça büyük ve büyüyor.
AJ00200

164

Ben kullanıyorum json:

import json

# convert to string
input = json.dumps({'id': id })

# load to dict
my_dict = json.loads(input) 

14

pickleModülü diske kaydetmek ve daha sonra yüklemek için modülü kullanın .


2
@extraneon Aslında, bu sorunun cevabı. Bir yerde bir dizgiye dönüştürür ve bir dosyaya yazar. Tüm turşu ile kapsüllenmiş olduğu gibi gerçek dönüşüm veya dosya yazma yapmak zorunda değilim.
AJ00200

11

Neden Python 3'ün dahili ast kütüphanesinin işlevini literal_eval kullanmıyorsunuz ? Kullanımı daha iyidir literal_eval yerine eval

import ast
str_of_dict = "{'key1': 'key1value', 'key2': 'key2value'}"
ast.literal_eval(str_of_dict)

gerçek Sözlük olarak çıktı verecektir

{'key1': 'key1value', 'key2': 'key2value'}

Ve eğer bir Sözlüğü bir String'e dönüştürmek istiyorsanız, Python'un str () yöntemini kullanmaya ne dersiniz ?

Sözlüğün:

my_dict = {'key1': 'key1value', 'key2': 'key2value'}

Ve bu şu şekilde yapılacak:

str(my_dict)

Yazdırılacak:

"{'key1': 'key1value', 'key2': 'key2value'}"

İstediğiniz kadar kolay.


5

Chinses ise

import codecs
fout = codecs.open("xxx.json", "w", "utf-8")
dict_to_json = json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
fout.write(dict_to_json + '\n')

1
Verdiğiniz kodun soruyu nasıl yanıtladığını açıklarsanız, bu daha iyi bir yanıt olacaktır.
pppery

4

Sözlüğü JSON'a (dize) dönüştürme

import json 

mydict = { "name" : "Don", 
          "surname" : "Mandol", 
          "age" : 43} 

result = json.dumps(mydict)

print(result[0:20])

Seni alacak:

{"name": "Don", "sur

Dizeyi sözlüğe dönüştür

back_to_mydict = json.loads(result) 

3

shelveKalıcı dosya destekli sözlük benzeri nesneler sağlayan modülü kullanmayı düşünmelisiniz . "Gerçek" bir sözlük yerine kullanımı kolaydır, çünkü programınıza neredeyse bir sözlük gibi kullanılabilen bir şeyi, açıkça bir dizeye dönüştürüp sonra bir dosyaya (veya yardımcı programa) gerek kalmadan sağlar. tam tersi).

Temel fark, başlangıçta gerek olduğu open()ilk kullanımdan önce kendisine ve daha sonra close()o işiniz bittiğinde (ve muhtemelen sync()bunu ing, bağlıwriteback kullanılan seçeneğe ) . Oluşturulan herhangi bir "raf" dosya nesneleri, mantıksal olarak iç içe yerleştirilmesine olanak tanıyan, normal sözlükler olarak değerler içerebilir.

İşte önemsiz bir örnek:

import shelve

shelf = shelve.open('mydata')  # open for reading and writing, creating if nec
shelf.update({'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }})
shelf.close()

shelf = shelve.open('mydata')
print shelf
shelf.close()

Çıktı:

{'three': {'three.1': 3.1, 'three.2': 3.2}, 'two': 2, 'one': 1}

2

Hızı önemsiyorsanız, json ile aynı API'ye sahip olan ujson'u (UltraJSON) kullanın :

import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]

1

Ben okunabilir olması gerekiyorsa yaml kullanın (ne JSON ne XML IMHO vardır), ya da okuma gerekli değilse turşu kullanın.

Yazmak

from pickle import dumps, loads
x = dict(a=1, b=2)
y = dict(c = x, z=3)
res = dumps(y)
open('/var/tmp/dump.txt', 'w').write(res)

Geri okuyun

from pickle import dumps, loads
rev = loads(open('/var/tmp/dump.txt').read())
print rev

bBurada dosyayı açarken gerçekten bayrak kullanmalısınız .
Piotr Dobrogost

1
Daha açık olabilirdim. Ancak, dumps()varsayılan olarak bir ascii protokolü olan protokol 0'a ayarlanır. Bu yüzden 'rb'IMHO gerekli değildir.
Gerard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.