`load` vs` load`, `dump` vs` dumps`

json модуль содержит функции для чтения и записи и из Юникода строк, и чтения и записи в файлах. Они различаются по замыкающей s в имени функции. В этих примерах мы используем объект StringIO, но те же функции применимы для любого файлового объекта.

Здесь мы используем строковые функции:

 import json

data = {u"foo": u"bar", u"baz": []}
json_string = json.dumps(data)
# u'{"foo": "bar", "baz": []}'
json.loads(json_string)
# {u"foo": u"bar", u"baz": []}

 

И здесь мы используем файловые функции:

 import json

from io import StringIO

json_file = StringIO()
data = {u"foo": u"bar", u"baz": []}
json.dump(data, json_file)
json_file.seek(0)  # Seek back to the start of the file before reading
json_file_content = json_file.read()
# u'{"foo": "bar", "baz": []}'
json_file.seek(0)  # Seek back to the start of the file before reading
json.load(json_file)
# {u"foo": u"bar", u"baz": []}

 

Как вы можете видеть, основное отличие состоит в том, что при выгрузке данных JSON вы должны передать дескриптор файла в функцию, а не захватывать возвращаемое значение. Также стоит отметить, что вы должны искать начало файла перед чтением или записью, чтобы избежать повреждения данных. При открытии файла курсор находится в положении 0 , поэтому ниже также будет работать:

 import json

json_file_path = './data.json'
data = {u"foo": u"bar", u"baz": []}

with open(json_file_path, 'w') as json_file:
    json.dump(data, json_file)

with open(json_file_path) as json_file:
    json_file_content = json_file.read()
    # u'{"foo": "bar", "baz": []}'

with open(json_file_path) as json_file:
    json.load(json_file)
    # {u"foo": u"bar", u"baz": []}

 

Имея оба способа работы с данными JSON позволяет идиоматически и эффективно работать с форматами , которые строят на JSON, такие как pyspark «s JSON-за линии:

 # loading from a file
data = [json.loads(line) for line in open(file_path).splitlines()]

# dumping to a file
with open(file_path, 'w') as json_file:
    for item in data:
        json.dump(item, json_file)
        json_file.write('\n')