Просто добавлю простой пример к тому, что все объяснили,
json.load ()
json.loadможет десериализовать файл сам, т.е. он принимает fileобъект, например,
# open a json file for reading and print content using json.load
with open("/xyz/json_data.json", "r") as content:
print(json.load(content))
будет выводить,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Если я использую, json.loadsчтобы открыть файл вместо
# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
print(json.loads(content))
Я получил бы эту ошибку:
Ошибка типа: ожидаемая строка или буфер
json.loads ()
json.loads() десериализовать строку.
Таким образом, для использования json.loadsмне придется передать содержимое файла с помощью read()функции, например,
использование content.read()с json.loads()возвратом содержимого файла,
with open("json_data.json", "r") as content:
print(json.loads(content.read()))
Вывод,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Это потому, что тип content.read()является строкой, т.е.<type 'str'>
Если я использую json.load()с content.read(), я получу ошибку,
with open("json_data.json", "r") as content:
print(json.load(content.read()))
дает,
AttributeError: у объекта 'str' нет атрибута 'read'
Итак, теперь вы знаете json.loadфайл json.loadsдесериализации и десериализацию строки.
Другой пример,
sys.stdinвернуть fileобъект, так что если я это сделаю print(json.load(sys.stdin)), я получу фактические данные JSON,
cat json_data.json | ./test.py
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Если я хочу использовать json.loads(), я бы сделал print(json.loads(sys.stdin.read()))вместо этого.
json.loads(s, *)- Deserializes(аstr,bytesилиbytearrayэкземпляр , содержащий JSON документ) - docs.python.org/3.6/library/json.html