Как записать данные JSON в файл?
Как мне записать данные в формате JSON, которые хранятся в словаре data
, в файл?
Я пытаюсь использовать следующий код:
f = open('data.json', 'wb')
f.write(data)
Однако я получаю ошибку:
TypeError: must be string or buffer, not dict
Как мне исправить это и корректно записать данные в файл?
5 ответ(ов)
Чтобы улучшить читаемость вашего JSON-файла для человека, я бы немного изменил предложенные ранее решения. Для этого используйте параметр sort_keys
, установленный на True
, и задайте indent
равным 4 пробелам. Также важно убедиться, что в вашем JSON-файле не будут записаны символы в ASCII-кодировке.
Вот пример кода, который выполняет эти требования:
import json
with open('data.txt', 'w') as out_file:
json.dump(json_data, out_file, sort_keys=True, indent=4, ensure_ascii=False)
Таким образом, вы получите более структурированный и читабельный файл JSON.
Если вы пытаетесь создать дамп данных на греческом или других "экзотических" языках, как и я, и сталкиваетесь с проблемами (ошибками уникодирования) из-за необычных символов, таких как символ мира (\u262E) или другие, которые часто встречаются в данных в формате JSON, например, из Twitter, решение может быть таким (параметр sort_keys
является необязательным):
import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
f.write(json.dumps(data, sort_keys=True, ensure_ascii=False))
Таким образом, вы сможете корректно сохранить данные с необычными символами в файл JSON без проблем с кодировкой.
Я не имею достаточной репутации, чтобы оставлять комментарии, поэтому хочу поделиться некоторыми своими наблюдениями по поводу этой раздражающей ошибки типа TypeError
здесь.
В основном, я думаю, что это ошибка в функции json.dump()
в Python 2. Она не может сохранить данные в формате Python (словарь / список), содержащие не-ASCII символы, даже если вы открываете файл с параметром encoding='utf-8'
. (То есть, что бы вы ни делали). Однако json.dumps()
работает как в Python 2, так и в Python 3.
Чтобы проиллюстрировать это, ссылаясь на ответ phihag: код в его ответе вызывает ошибку в Python 2 с исключением TypeError: must be unicode, not str
, если data
содержит не-ASCII символы. (Python 2.7.6, Debian):
import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'абвгд': 1}
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)
В то время как в Python 3 этот код работает нормально.
Чтобы записать данные в файл в формате JSON, вы можете воспользоваться функциями json.dump()
или json.dumps()
. В случае, если вам нужно сохранить данные непосредственно в файл, используйте json.dump()
. Вот пример, как это можно сделать:
import json
data = [1, 2, 3, 4, 5] # Допустим, у нас есть список с данными
with open('no.txt', 'w') as txtfile: # Открываем файл 'no.txt' для записи
json.dump(data, txtfile) # Записываем данные в файл в формате JSON
В этом примере список data
будет сохранен в файл no.txt
в виде JSON-формата.
Ваш код имеет небольшой недостаток. Вы используете 'wb'
(режим записи в бинарном формате) при открытии файла для функции json.dump()
, что не является необходимым, поскольку JSON является текстовым форматом. Рекомендуется использовать текстовый режим 'w'
вместо 'wb'
. Вот правильный способ записи данных в файл с использованием json.dump()
:
import json
with open('data.txt', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False)
В этом примере:
- Мы используем контекстный менеджер
with
, который автоматически закроет файл после завершения записи. - Режим
'w'
используется для записи в текстовом формате. - Параметр
ensure_ascii=False
позволяет сохранить данные в оригинальном формате (например, Unicode), что может быть полезно, если ваши данные содержат символы, не входящие в ASCII.
Как обойти "datetime.datetime не сериализуем в JSON"?
Почему Python не может разобрать эти данные JSON? [закрыто]
Как сделать класс сериализуемым в JSON
Как отправить JSON-данные с помощью Python Requests?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе