Вопрос-Ответ

How do I write JSON data to a file?

Как мне записать JSON-данные в файл?

Как мне записать данные JSON, хранящиеся в словаре data, в файл?

f = open('data.json', 'wb')
f.write(data)

Это выдает ошибку:


TypeError: должно быть string или buffer, не dict


Переведено автоматически
Ответ 1

data это словарь Python. Перед записью его необходимо закодировать как JSON.

Используйте это для максимальной совместимости (Python 2 и 3):

import json
with open('data.json', 'w') as f:
json.dump(data, f)

В современной системе (т. Е. с поддержкой Python 3 и UTF-8) вы можете написать более удобный файл, используя:

import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)

Смотрите json документацию.

Ответ 2

Чтобы получить файл в в utf8, а не в в ascii, в принятом ответе для Python 2 используйте:

import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))

В Python 3 код проще:

import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)

В Windows по-прежнему необходим encoding='utf-8' аргумент to open.

Чтобы избежать хранения закодированной копии данных в памяти (результат dumps) и выводить байтовые строки в кодировке utf8 как в Python 2, так и в Python 3, используйте:

import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)

codecs.getwriter Вызов избыточен в Python 3, но необходим для Python 2


Удобочитаемость и размер:

Использование ensure_ascii=False обеспечивает лучшую читабельность и меньший размер:

>>> json.dumps({'price': '€10'})
'{"price": "\\u20ac10"}'
>>> json.dumps({'price': '€10'}, ensure_ascii=False)
'{"price": "€10"}'

>>> len(json.dumps({'абвгд': 1}))
37
>>> len(json.dumps({'абвгд': 1}, ensure_ascii=False).encode('utf8'))
17

Еще больше улучшите читаемость, добавив флаги indent=4, sort_keys=True (как предложено dinos66) к аргументам dump или dumps. Таким образом, вы получите упорядоченную структуру json с хорошим отступом за счет немного большего размера файла.

Ответ 3

Я бы ответил с небольшими изменениями вышеупомянутыми ответами, а именно написать улучшенный файл JSON, который человеческий глаз может читать лучше. Для этого передайте sort_keys как True и indent с 4 пробелами, и все готово. Также позаботьтесь о том, чтобы коды ascii не были записаны в ваш JSON-файл:

with open('data.txt', 'w') as out_file:
json.dump(json_data, out_file, sort_keys = True, indent = 4,
ensure_ascii = False)
Ответ 4

Чтение и запись файлов JSON с помощью Python 2 + 3; работает с Unicode

# -*- coding: utf-8 -*-
import json

# Make it work for Python 2+3 and with Unicode
import io
try:
to_unicode = unicode
except NameError:
to_unicode = str

# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
'a string': 'bla',
'another dict': {'foo': 'bar',
'key': 'value',
'the answer': 42}}

# Write JSON file
with io.open('data.json', 'w', encoding='utf8') as outfile:
str_ = json.dumps(data,
indent=4, sort_keys=True,
separators=(',', ': '), ensure_ascii=False)
outfile.write(to_unicode(str_))

# Read JSON file
with open('data.json') as data_file:
data_loaded = json.load(data_file)

print(data == data_loaded)

Объяснение параметров json.dump:


  • indent: Используйте 4 пробела для отступа каждой записи, например, при запуске нового dict (в противном случае все будет в одной строке),

  • sort_keys: отсортируйте ключи словарей. Это полезно, если вы хотите сравнить файлы json с помощью инструмента diff / поместить их под контроль версий.

  • separators: Чтобы Python не добавлял завершающие пробелы

С помощью пакета

Взгляните на мой пакет утилит, mpu он очень простой и легко запоминающийся:

import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)

Создан JSON-файл

{
"a list":[
1,
42,
3.141,
1337,
"help",
"€"
],
"a string":"bla",
"another dict":{
"foo":"bar",
"key":"value",
"the answer":42
}
}

Распространенные окончания файлов

.json

Альтернативы

Для вашего приложения может быть важно следующее:


  • Поддержка другими языками программирования

  • Производительность чтения / записи

  • Компактность (размер файла)

Смотрите также: Сравнение форматов сериализации данных

Если вы ищете способ создания файлов конфигурации, возможно, вам захочется прочитать мою короткую статью Файлы конфигурации в Python

python json