У меня есть данные JSON, хранящиеся в переменной data
.
Я хочу записать это в текстовый файл для тестирования, чтобы мне не приходилось каждый раз получать данные с сервера.
В настоящее время я пытаюсь это:
obj = open('data.txt', 'wb')
obj.write(data)
obj.close
И я получаю эту ошибку:
Ошибка типа: должна быть строкой или буфером, а не dict
Как это исправить?
json.dump
записывает в файл или подобный файлу объект, тогда какjson.dumps
возвращает строку.json.dump
пишет в текстовый файл, а не в двоичный файл. Вы получите,TypeError
если файл был открыт сwb
. В более старых версиях Python работают какw
nand , так и другиеwb
. Явное кодирование не требуется, так как выводjson.dump
по умолчанию только для ASCII. Если вы можете быть уверены, что ваш код никогда не запускается на устаревших версиях Python, и вы и обработчик файла JSON можете правильно обрабатывать данные, не относящиеся к ASCII, вы можете указать их и установитьensure_ascii=False
.Чтобы получить файл с кодировкой utf8, а не кодированный ascii в принятом ответе для Python 2, используйте:
Код проще в Python 3:
В Windows
encoding='utf-8'
аргумент toopen
по-прежнему необходим.Чтобы не хранить зашифрованную копию данных в памяти (результат
dumps
) и выводить строки кодирования utf8 в Python 2 и 3, используйте:codecs.getwriter
Вызов является излишним в Python 3 , но требуется для Python 2Читаемость и размер:
Использование
ensure_ascii=False
дает лучшую читаемость и меньший размер:Дальнейшее улучшение читабельности путем добавления флагов
indent=4, sort_keys=True
(как предложено dinos66 ) к аргументамdump
илиdumps
. Таким образом, вы получите аккуратно отсортированную структуру с отступом в файле json за счет немного большего размера файла.источник
unicode
лишнее - результатjson.dumps
уже является объектом Unicode. Обратите внимание, что это не работает в 3.x, где весь этот беспорядок режима выходного файла был очищен, и json всегда использует символьные строки (и символьный ввод / вывод) и никогда не байты.type(json.dumps('a'))
есть<type 'str'>
. Дажеtype(json.dumps('a', encoding='utf8'))
есть<type 'str'>
.utf8
даже в 3.x. Обновил ответ.'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128)
. Поэтому, если вы сомневаетесь, используйте ответ 3.x!Я бы ответил с небольшими изменениями с вышеупомянутыми ответами, а именно, чтобы написать предварительно подтвержденный файл JSON, который человеческие глаза могут читать лучше. Для этого передайте
sort_keys
какTrue
иindent
с 4 пробелами, и все готово. Также позаботьтесь о том, чтобы коды ascii не были записаны в вашем файле JSON:источник
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'
# -*- coding: utf-8 -*-
после shebangUnicodeEncodeError
с данными, отличными от ascii). Смотрите мое решение для деталей.Чтение и запись файлов JSON с помощью Python 2 + 3; работает с юникодом
Объяснение параметров
json.dump
:indent
: Используйте 4 пробела для отступа каждой записи, например, когда начинается новый dict (иначе все будут в одной строке),sort_keys
: сортировка ключей словарей. Это полезно, если вы хотите сравнить файлы json с помощью инструмента сравнения / поставить их под контроль версий.separators
: Запретить Python добавлять конечные пробелыС пакетом
Взгляните на мой пакет утилит
mpu
для супер простого и легко запоминающегося:Создан файл JSON
Общие окончания файлов
.json
альтернативы
Для вашего приложения может быть важно следующее:
Смотрите также: Сравнение форматов сериализации данных
Если вы предпочитаете создавать файлы конфигурации, вы можете прочитать мою короткую статью Файлы конфигурации в Python
источник
force_ascii
флаг установленTrue
по умолчанию. Вы будете иметь нечитаемые 6-байтовые"\u20ac"
последовательности для каждого€
в вашем json-файле (а также любого другого не-ascii символа).open
для чтения, ноio.open
для письма? Это можно использоватьio.open
для чтения, а? Если это так, какие параметры должны быть переданы?Для тех из вас, кто пытается избавиться от греческого или других «экзотических» языков, таких как я, но также имеет проблемы (ошибки Юникода) со странными символами, такими как символ мира (\ u262E) или другими, которые часто содержатся в данных, отформатированных в json например, Twitter, решение может быть следующим (sort_keys явно необязателен):
источник
open
и assotiatedio.open
надcodecs.open
, в данном случае это также хороший обратной совместимости хак. В python2codecs.open
более «всеяден», чем io.open (он может «съесть» как str, так и unicode, конвертируя при необходимости). Можно сказать, что этаcodecs.open
причуда компенсируетjson.dumps
причуду генерации различных типов объектов (str
/unicode
) в зависимости от наличия строк ввода Unicode на входе.У меня недостаточно репутации, чтобы добавлять комментарии, поэтому я просто напишу некоторые из своих выводов об этой надоедливой ошибке TypeError здесь:
По сути, я думаю, что это ошибка в
json.dump()
функции только в Python 2 - она не может вывести данные Python (словарь / список), содержащие не-ASCII символы, даже если вы открываете файл сencoding = 'utf-8'
параметром. (т.е. независимо от того, что вы делаете). Ноjson.dumps()
работает на Python 2 и 3.Чтобы проиллюстрировать это, проследим за ответом phihag: код в его ответе разбивается на Python 2 за исключением
TypeError: must be unicode, not str
, если онdata
содержит символы не ASCII. (Python 2.7.6, Debian):Тем не менее, он отлично работает в Python 3.
источник
data = {'asdf': 1}
. Вы получите пресловутыйTypeError
с вашим (вторым) вариантом.ensure_ascii
- это необходимо, если вы хотите получить "настоящий" вывод utf8. Без этого у вас будет простой ascii с 6 байтами на русскую букву, а не 2 байта на символ с этим флагом.unicode()
часть. Я только что понял дляio
пакета в Python 2,write()
нуждаетсяunicode
, а неstr
.Запишите данные в файл, используя JSON, используя json.dump () или json.dumps () . напишите так, чтобы сохранить данные в файле.
этот пример в списке хранится в файл.
источник
Чтобы написать JSON с отступом "pretty print":
Кроме того, если вам нужно отладить неправильно отформатированный JSON и получить полезное сообщение об ошибке, используйте
import simplejson
библиотеку вместоimport json
(функции должны быть такими же)источник
источник
f = open('1.txt', 'w'); f.write('a'); input()
. Запустите его, а затем SYGTERM (Ctrl-Z
затемkill %1
в Linux,Ctrl-Break
в Windows).1.txt
будет иметь 0 байтов. Это связано с тем, что запись была буферизована, а файл не был ни сброшен, ни закрыт в момент возникновения SYGTERM.with
Блок гарантирует, что файл всегда будет закрыт так же, как блок «try / finally», но короче.Запись JSON в файл
Чтение JSON из файла
источник
если вы пытаетесь записать pandas dataframe в файл в формате json, я бы порекомендовал это
источник
Все предыдущие ответы верны, вот очень простой пример:
источник
Принятый ответ в порядке. Тем не менее, я столкнулся с ошибкой "не json serializable", используя это.
Вот как я исправил это
open("file-name.json", 'w')
как вывод:output.write(str(response))
Хотя это не очень удачное решение, так как создаваемый файл json не будет иметь двойных кавычек, однако это хорошо, если вы ищете быстрый и грязный.
источник
Данные JSON могут быть записаны в файл следующим образом
Написать в файл:
источник