بيثون مقروء الإنسان كائن التسلسل
-
03-07-2019 - |
سؤال
أحتاج إلى متجر الثعبان الهياكل المصنوعة من قوائم / قواميس, الصفوف في تنسيق قابل للقراءة.الفكرة هي مثل استخدام شيء مشابه المخلل, لكن المخلل لا دية الإنسان.الخيارات الأخرى التي تتبادر إلى ذهني هي YAML (من خلال PyYAML و سلمان (من خلال simplejson) serializers.
أي الخيار الذي يأتي إلى ذهنك ؟
شكرا مقدما.
المحلول
لحالات بسيطة pprint () وحدة التقييم () تتبادر إلى الذهن.
وعن طريق المثال الخاص بك:
>>> d = {'age': 27,
... 'name': 'Joe',
... 'numbers': [1,
... 2,
... 3,
... 4,
... 5],
... 'subdict': {
... 'first': 1,
... 'second': 2,
... 'third': 3
... }
... }
>>>
>>> from pprint import pprint
>>> pprint(d)
{'age': 27,
'name': 'Joe',
'numbers': [1, 2, 3, 4, 5],
'subdict': {'first': 1, 'second': 2, 'third': 3}}
>>>
وأود أن تفكر مرتين تحديد شرطين بنفس الأداة. هل يعتبر استخدام المخلل للالتسلسلية ثم pprint () (أو المشاهد وجوه أكثر نزوة) للإنسان يبحث في الكائنات؟
نصائح أخرى
إذا فقط بيثون قائمة المهام, القاموس و tuple الكائن.- سلمان هو الطريق للذهاب.الإنسان للقراءة ، من السهل جدا في التعامل معها لغة مستقلة أيضا.
تنبيه:الصفوف سيتم تحويلها إلى قوائم في simplejson.
In [109]: simplejson.loads(simplejson.dumps({'d':(12,3,4,4,5)}))
Out[109]: {u'd': [12, 3, 4, 4, 5]}
إذا كنت بعد أكثر تعهدات من مشمولة JSON, أنا أوصي التحقق من بيون (الثعبان تدوين كائن)...على الرغم من أنني أعتقد انها تقتصر على 2.6/3.0 وما فوق ، كما أنه يعتمد على ast وحدة نمطية.أنه يتعامل مع فئة مخصصة حالات متكررة أنواع البيانات ، من بين الميزات الأخرى التي هي أكثر من التي تقدمها JSON.
ويجب أن تحقق من jsonpickle ( https://github.com/jsonpickle/jsonpickle ). فإنه سيتم كتابة من أي كائن بيثون في ملف سلمان. يمكنك ثم قراءة هذا الملف مرة أخرى إلى كائن الثعبان. والشيء الجميل هو ملف المنتصف قابل للقراءة للغاية لأنها سلمان.
وماذا تعني هذه ليست الإنسان للقراءة ؟؟؟ ؛)
>>> d = {'age': 27,
... 'name': 'Joe',
... 'numbers': [1,2,3,4,5],
... 'subdict': {'first':1, 'second':2, 'third':3}
... }
>>>
>>> import pickle
>>> p = pickle.dumps(d)
>>> p
"(dp0\nS'age'\np1\nI27\nsS'subdict'\np2\n(dp3\nS'second'\np4\nI2\nsS'third'\np5\nI3\nsS'first'\np6\nI1\nssS'name'\np7\nS'Joe'\np8\nsS'numbers'\np9\n(lp10\nI1\naI2\naI3\naI4\naI5\nas."
حسنا، حسنا، ربما يستغرق سوى بعض الممارسات ... أو هل يمكن خداع ...
>>> import pickletools
>>> pickletools.dis(p)
0: ( MARK
1: d DICT (MARK at 0)
2: p PUT 0
5: S STRING 'age'
12: p PUT 1
15: I INT 27
19: s SETITEM
20: S STRING 'subdict'
31: p PUT 2
34: ( MARK
35: d DICT (MARK at 34)
36: p PUT 3
39: S STRING 'second'
49: p PUT 4
52: I INT 2
55: s SETITEM
56: S STRING 'third'
65: p PUT 5
68: I INT 3
71: s SETITEM
72: S STRING 'first'
81: p PUT 6
84: I INT 1
87: s SETITEM
88: s SETITEM
89: S STRING 'name'
97: p PUT 7
100: S STRING 'Joe'
107: p PUT 8
110: s SETITEM
111: S STRING 'numbers'
122: p PUT 9
125: ( MARK
126: l LIST (MARK at 125)
127: p PUT 10
131: I INT 1
134: a APPEND
135: I INT 2
138: a APPEND
139: I INT 3
142: a APPEND
143: I INT 4
146: a APPEND
147: I INT 5
150: a APPEND
151: s SETITEM
152: . STOP
highest protocol among opcodes = 0
>>>
وكنت لا تزال لديك لقراءة الكائن مخلل من ملف، ومع ذلك فإنك لن تحتاج إلى load
ذلك. لذا، إذا انها "خطير" وجوه، لا يزال قد تكون قادرة على هذا الرقم قبل القيام load
. إذا كنت عالقة مع pickle
، قد يكون خيارا جيدا للفك رموز ما لديك.
لاستخدام simplejson أولا على easy_install simplejson : ل
import simplejson
my_structure = {"name":"Joe", "age":27, "numbers":[1,2,3,4,5], "subdict":{"first":1, "second":2, "third": 3}}
json = simplejson.dumps(my_structure)
والنتائج في كائن JSON:
{"age": 27, "subdict": {"second": 2, "third": 3, "first": 1}, "name": "Joe", "numbers": [1, 2, 3, 4, 5]}
لاحظ أن في يطرأ تغير شكل القاموس على الإطلاق، ولكن يجب تشغيله من خلال هذه الخطوة إلى ضمان البيانات JSON صالحة.
ويمكنك طباعة مزيد كبير نتيجة:
import pprint
pprint.pprint(my_structure)
نتائج البحث في
{'age': 27,
'name': 'Joe',
'numbers': [1, 2, 3, 4, 5],
'subdict': {'first': 1, 'second': 2, 'third': 3}}
هناك أكسون (نصية) الشكل التي تجمع بين أفضل من JSON, XML و YAML.أكسون تنسيق جدا للقراءة المدمجة نسبيا.
الثعبان (2.7/3.3-3.7) وحدة pyaxon يدعم load(s)
/dump(s)
وظائف تكرارية بما في ذلك loading
/dumping
.انها سريعة بما فيه الكفاية لكي تكون مفيدة.
النظر في مثال بسيط:
>>> d = {
'age': 27, 'name': 'Joe',
'numbers': [1, 2, 3, 4, 5],
'subdict': {'first': 1, 'second': 2, 'third': 3}
}
# pretty form
>>> axon.dumps(d, pretty=1)
{ age: 27
name: "Joe"
numbers: [1 2 3 4 5]
subdict: {
first: 1
second: 2
third: 3}}
# compact form
>>> axon.dumps(d)
{age:27 name:"Joe" numbers:[1 2 3 4 5] subdict:{first:1 second:2 third:3}}
فإنه يمكن أيضا التعامل مع كائنات متعددة في الرسالة:
>>> msg = axon.dumps([{'a':1, 'b':2, 'c':3}, {'a':2, 'b':3, 'c':4}])
>>> print(msg)
{a:1 b:2 c:3}
{a:2 b:3 c:4}
{a:3 b:4 c:5}
ومن ثم تحميلها تكرارا:
for d in axon.iloads(msg):
print(d)