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

У меня есть данные JSON, хранящиеся в переменных data .

Я хочу записать это в текстовый файл для тестирования, поэтому мне не нужно каждый раз захватывать данные с сервера.

В настоящее время я стараюсь:

 obj = open('data.txt', 'wb') obj.write(data) obj.close 

И я получаю ошибку:

TypeError: must be string or buffer, not dict

Как это исправить?

10 Solutions collect form web for “Как записать данные JSON в файл?”

Вы забыли фактическую часть JSON – data являются словарем и еще не закодированы JSON. Напишите так:

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

Примечание: Работает как с 3.x, так и 2.x.

Чтобы получить файл utf8 -encoded в отличие от ascii -encoded в принятом ответе для 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' для open по-прежнему необходим.

Чтобы избежать сохранения закодированной копии данных в памяти (результат dumps ) и вывода utf8-закодированных байтов в обоих Python 2 и 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_acsii=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-файле ценой чуть большего размера файла.

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

 with open('data.txt', 'w') as outfile: json.dump(jsonData, outfile, sort_keys = True, indent = 4, ensure_ascii = False) 

Чтение и запись файлов 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 конечных пробелов

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

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

Общие окончания файлов

.json

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

  • CSV: Супер простой формат ( чтение и запись )
  • JSON: Приятно для написания удобочитаемых данных; ОЧЕНЬ широко используется ( чтение и запись )
  • YAML: YAML является надмножеством JSON, но легче читать ( читать и писать , сравнивать JSON и YAML )
  • pickle: формат сериализации Python ( чтение и запись )
  • MessagePack ( пакет Python ): более компактное представление ( чтение и запись )
  • HDF5 ( пакет Python ): Nice для матриц ( чтение и запись )
  • XML: существует слишком * sigh * ( чтение и запись )

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

  • Поддержка другими языками программирования
  • Чтение / запись
  • Компактность (размер файла)

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

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

Для тех из вас, кто пытается сбросить греческий или другие «экзотические» языки, такие как я, но также имеют проблемы (ошибки в Unicode) со странными символами, такими как символ мира (\ 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)) 

У меня недостаточно репутации для добавления комментариев, поэтому я просто пишу некоторые из моих находок этого раздражающего 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):

 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.dump(data, open('data.txt', 'wb')) 

Напишите данные в файле, используя JSON, используйте json.dump () или json.dumps () . напишите так, чтобы сохранить данные в файле.

 import json data = [1,2,3,4,5] with open('no.txt', 'w') as txtfile: json.dump(data, txtfile) 

этот пример в списке хранится в файле.

Вот полезная структура для чтения и записи файла в Python 3.

 from json import dump, load from time import sleep from random import random def json_file(path, data = None, delay = 0.1): while True: try: if data == None: with open(path, "r", encoding = "utf-8") as f: return load(f) else: with open(path, "w", encoding = "utf-8") as f: return dump(data, f) except: sleep(random()*delay) # concurrency 

если вы пытаетесь написать файл данных pandas в файл, используя формат json, я бы рекомендовал это

 destination='filepath' saveFile = open(destination, 'w') saveFile.write(df.to_json()) saveFile.close() 
  • Передача объектов из Django в Javascript DOM
  • Преобразование массива JSON в список Python
  • Санизирующие материалы для MongoDB
  • instagram.bind.InstagramClientError: не удается проанализировать ответ, недействителен JSON
  • TCP-сервер / клиент: Сломанная труба
  • Python: как я могу разобрать {apple: "1", orange: "2"} в словаре?
  • Возвращение массива JSON из представления Django в шаблон
  • Невозможно выполнить циклический отклик API с Python
  • Python - лучший язык программирования в мире.