Мне тоже было нужно это, но, основываясь на этом потоке, я решил, что это невозможно, используя только модуль io
Python 2. Хотя это нарушает правило «Специальное лечение для file
», метод, с которым я пошел, заключался в создании чрезвычайно тонкой обертки для file
(код ниже), который затем можно было бы обернуть в io.BufferedReader
, что, в свою очередь, может быть передается конструктору io.TextIOWrapper
. Это будет болью для модульного теста, поскольку, очевидно, новый код не может быть протестирован на Python 3.
Кстати, причина, по которой результаты open()
могут быть переданы непосредственно на io.TextIOWrapper
в Python 3 - это потому, что двоичный режим open()
фактически возвращает экземпляр io.BufferedReader
для начала (по крайней мере, на Python 3.4, где я тестировал в то время).
import io
import six # for six.PY2
if six.PY2:
class _ReadableWrapper(object):
def __init__(self, raw):
self._raw = raw
def readable(self):
return True
def writable(self):
return False
def seekable(self):
return True
def __getattr__(self, name):
return getattr(self._raw, name)
def wrap_text(stream, *args, **kwargs):
# Note: order important here, as 'file' doesn't exist in Python 3
if six.PY2 and isinstance(stream, file):
stream = io.BufferedReader(_ReadableWrapper(stream))
return io.TextIOWrapper(stream)
По крайней мере, это мало, поэтому, надеюсь, это минимизирует экспозицию для деталей, которые не могут быть легко протестированы.
import json
d = json.loads(j)
print d['glossary']['title']
Если вы доверяете источнику данных, вы можете использовать eval
для преобразования вашей строки в словарь:
eval(your_json_format_string)
Пример:
>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)
>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}
>>> print type(x), type(y)
<type 'str'> <type 'dict'>
>>> print y['a'], type(y['a'])
1 <type 'int'>
>>> print y['a'], type(y['b'])
1 <type 'bool'>
>>> print y['a'], type(y['c'])
1 <type 'str'>
использовать simplejson или cjson для ускорения
import simplejson as json
json.loads(obj)
or
cjson.decode(obj)
Когда я начал использовать json, я был смущен и не смог разобраться в нем некоторое время, но, наконец, я получил то, что хотел. Вот простое решение
import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print o['id'], o['name']