Сохранение значений json в текстовый файл [дубликат]

Если ваша команда генерирует исключение, ваше соединение никогда не будет закрыто:

try   
{   
    con.Open();   
    SqlCommand cmd1 = new SqlCommand(query, con);   
    cmd1.ExecuteNonQuery();       
}    
catch (Exception ex) { throw ex; }   
finally {
    if (con.State == ConnectionState.Open)
        con.Open(); 
}
687
задан martineau 30 July 2017 в 15:55
поделиться

9 ответов

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

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

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

1334
ответ дан Community 16 August 2018 в 11:07
поделиться
  • 1
    это может быть полезно для сериализации: stackoverflow.com/questions/4512982/… – jedierikb 11 February 2013 в 19:27
  • 2
    Вы имеете в виду json.dump или json.dumps? – TerminalDilettante 13 August 2015 в 14:46
  • 3
    @TerminalDilettante json.dump записывает файл или файл-подобный объект, тогда как json.dumps возвращает строку. – phihag 13 August 2015 в 20:58
  • 4
    btw: перечитать использование данных: с открытым ('data.txt') как infile: d = json.load (infile). См .: этот ответ – klaas 7 March 2016 в 13:59
  • 5
    @denvar Нет, этот ответ точно настроен. На Python 3, json.dump записывает в текстовый файл, а не в двоичный файл. Вы получите TypeError, если файл был открыт с помощью wb. В более старых версиях Python работают w nand wb. Явное кодирование не требуется, так как вывод json.dump является ASCII-only по умолчанию. Если вы можете быть уверены, что ваш код никогда не запускается на устаревших версиях Python, и вы и обработчик JSON-файла могут корректно обрабатывать не-ASCII-данные, вы можете указать один и установить ensure_ascii=False. – phihag 19 April 2016 в 18:47
json.dump(data, open('data.txt', 'wb'))
4
ответ дан Alexander 16 August 2018 в 11:07
поделиться
  • 1
    Это делает то же самое, что и ответ @ phihag, но не гарантирует, что он будет работать в любое время. Рассмотрим такой код: f = open('1.txt', 'w'); f.write('a'); input(). Запустите его, а затем SYGTERM it (Ctrl-Z, затем kill %1 в linux, Ctrl-Break в Windows). 1.txt будет содержать 0 байт. Это связано с тем, что запись была буферизована, и файл не был сброшен не закрыт в тот момент, когда произошел SYGTERM. Блок with гарантирует, что файл всегда закрывается, как блок «try / finally», но короче. – Antony Hatchkins 10 February 2017 в 11:27

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

130
ответ дан Antony Hatchkins 16 August 2018 в 11:07
поделиться
  • 1
    все еще получая UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' – nottinhill 14 October 2014 в 00:16
  • 2
    @SirBenBenji Убедитесь, что строка, которую вы пытаетесь записать, следует следовать: str.decode ('utf-8'). – ambodi 22 April 2015 в 09:08
  • 3
    @SirBenBenji Вы также можете попробовать использовать кодеки, так как dinos66 указывает ниже – Shiv 3 September 2015 в 19:01
  • 4
    Вы также должны объявить свою кодировку, добавив # -*- coding: utf-8 -*- после shebang – aesede 2 April 2016 в 17:29
  • 5
    Приведите причины, когда вы утверждаете, что что-то не так. Используйте @nickname, чтобы человек получил уведомление. Вы не можете писать комментарии, но можете читать комментарии. Как уже было сказано в моем ответе на первый комментарий, попробуйте data = {'asdf': 1}. Вы получите пресловутый TypeError с вашим (вторым) вариантом. – Antony Hatchkins 10 February 2017 в 09:55
  • 6
    Что касается ensure_ascii - это необходимо, если вы хотите получить «реальный». utf8 мощность. Без этого у вас будет простой ascii с 6 байтами на русское письмо, а не с 2 байтами на символ с этим флагом. – Antony Hatchkins 10 February 2017 в 09:56
  • 7
    +1 для sort_keys и отступ. @aesede Неплохо добавить эту строку, потому что она создаст впечатление, что это решение также работает с python2, а это не (UnicodeEncodeError с данными, отличными от ascii). Подробнее см. В моем решении . – Antony Hatchkins 10 February 2017 в 11:41
  • 8
    @AntonyHatchkins Вы правы для части unicode(). Я просто понял, что для пакета io в Python 2, write() требуется unicode, а не str. – ibic 12 February 2017 в 17:29
  • 9
    Этот код работает для меня даже с python2.6.6, Debian (10 декабря 2010 г.). Также как с python2.7.9 или python3. Проверьте еще раз, плз. – Antony Hatchkins 21 February 2017 в 05:40

Для тех из вас, кто пытается сбросить греческий или другие «экзотические» языки, такие как я, но также имеют проблемы (ошибки в 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))
18
ответ дан dinos66 16 August 2018 в 11:07
поделиться
  • 1
    +1 Хотя docs рекомендует python3 builtin open и ассоциированный io.open по codecs.open, в этом случае это также хороший обратный совместимый взлом. В python2 codecs.open более "всеядно" чем io.open (он может «съедать» как str, так и unicode, при необходимости конвертируя). Можно сказать, что это codecs.open quirk компенсирует json.dumps quirk генерации различных типов объектов (str / unicode) в зависимости от наличия строк юникода на входе. – Antony Hatchkins 10 February 2017 в 12:06

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

destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()
2
ответ дан Franco Miguel Contreras 16 August 2018 в 11:07
поделиться

Вот полезная структура для чтения и записи файла в 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
0
ответ дан jcrs 16 August 2018 в 11:07
поделиться

Чтение и запись файлов 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

81
ответ дан Martin Thoma 16 August 2018 в 11:07
поделиться
  • 1
    Обратите внимание, что флаг force_ascii по умолчанию True. У вас будут нечитаемые 6-байтные "\u20ac" последовательности для каждого в вашем json-файле (а также любого другого символа, отличного от ascii). – Antony Hatchkins 10 February 2017 в 12:13
  • 2
    Почему вы используете open для чтения, но io.open для записи? Возможно ли использовать io.open для чтения? Если да, какие параметры должны быть переданы? – Micah Zoltu 5 June 2017 в 05:31
  • 3
    я бы поднял это, как 500 раз, красиво сделано – Nils Zenker 26 April 2018 в 07:40

Чтобы получить 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' для 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_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-файле за немного больший размер файла.

200
ответ дан Prof. Falken 16 August 2018 в 11:07
поделиться
  • 1
    unicode является излишним - результат json.dumps уже является объектом unicode. Обратите внимание, что это не работает в 3.x, где весь этот беспорядок в режиме выходного файла был очищен, а json всегда использует символьные строки (и символьный ввод-вывод) и никогда не байт. – phihag 14 February 2013 в 13:20
  • 2
    В 2.x type(json.dumps('a')) есть <type 'str'>. Даже type(json.dumps('a', encoding='utf8')) - <type 'str'>. – Antony Hatchkins 14 February 2013 в 13:25
  • 3
    Да, в 3.x json используются строки, но кодировка по умолчанию - ascii. Вы должны явно сказать, что хотите utf8 даже в 3.x. Обновлен ответ. – Antony Hatchkins 14 February 2013 в 13:39
  • 4
    О, ты совершенно прав - я, должно быть, что-то смутил. +1 для деталей. – phihag 14 February 2013 в 16:52
  • 5
    Ответ Python 3.x работал для меня, хотя я использую 2.7. Ответ 2.x возвращает ошибку: 'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128). Поэтому, когда вы сомневаетесь, используйте ответ 3.x! – Blairg23 22 December 2015 в 19:44

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

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

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

6
ответ дан Vishal Gediya 16 August 2018 в 11:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: