Если ваша команда генерирует исключение, ваше соединение никогда не будет закрыто:
try
{
con.Open();
SqlCommand cmd1 = new SqlCommand(query, con);
cmd1.ExecuteNonQuery();
}
catch (Exception ex) { throw ex; }
finally {
if (con.State == ConnectionState.Open)
con.Open();
}
Вы забыли фактическую часть JSON - data
- это словарь и еще не закодированный JSON. Напишите это следующим образом:
import json
with open('data.json', 'w') as outfile:
json.dump(data, outfile)
Примечание: Работает как с 3.x, так и с 2.x.
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.
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'
– nottinhill
14 October 2014 в 00:16
# -*- coding: utf-8 -*-
после shebang
– aesede
2 April 2016 в 17:29
data = {'asdf': 1}
. Вы получите пресловутый TypeError
с вашим (вторым) вариантом.
– Antony Hatchkins
10 February 2017 в 09:55
ensure_ascii
- это необходимо, если вы хотите получить «реальный». utf8 мощность. Без этого у вас будет простой ascii с 6 байтами на русское письмо, а не с 2 байтами на символ с этим флагом.
– Antony Hatchkins
10 February 2017 в 09:56
UnicodeEncodeError
с данными, отличными от ascii). Подробнее см. В моем решении .
– Antony Hatchkins
10 February 2017 в 11:41
unicode()
. Я просто понял, что для пакета io
в Python 2, write()
требуется unicode
, а не str
.
– ibic
12 February 2017 в 17:29
Для тех из вас, кто пытается сбросить греческий или другие «экзотические» языки, такие как я, но также имеют проблемы (ошибки в 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))
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()
Вот полезная структура для чтения и записи файла в 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
# -*- 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)
{
"a list":[
1,
42,
3.141,
1337,
"help",
"€"
],
"a string":"bla",
"another dict":{
"foo":"bar",
"key":"value",
"the answer":42
}
}
.json
Для вашего приложения может быть важно следующее:
См. Также: Сравнение форматов сериализации данных
Если вы скорее ищете способ создания файлов конфигурации, вы можете прочитать мою короткую статью Конфигурационные файлы в Python
force_ascii
по умолчанию True
. У вас будут нечитаемые 6-байтные "\u20ac"
последовательности для каждого €
в вашем json-файле (а также любого другого символа, отличного от ascii).
– Antony Hatchkins
10 February 2017 в 12:13
open
для чтения, но io.open
для записи? Возможно ли i> использовать io.open
для чтения? Если да, какие параметры должны быть переданы?
– Micah Zoltu
5 June 2017 в 05:31
Чтобы получить 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-файле за немного больший размер файла.
unicode
является излишним - результат json.dumps
уже является объектом unicode. Обратите внимание, что это не работает в 3.x, где весь этот беспорядок в режиме выходного файла был очищен, а json всегда использует символьные строки (и символьный ввод-вывод) и никогда не байт.
– phihag
14 February 2013 в 13:20
type(json.dumps('a'))
есть <type 'str'>
. Даже type(json.dumps('a', encoding='utf8'))
- <type 'str'>
.
– Antony Hatchkins
14 February 2013 в 13:25
utf8
даже в 3.x. Обновлен ответ.
– Antony Hatchkins
14 February 2013 в 13:39
'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)
этот пример в списке хранится в файле.
json.dump
записывает файл или файл-подобный объект, тогда какjson.dumps
возвращает строку. – phihag 13 August 2015 в 20:58json.dump
записывает в текстовый файл, а не в двоичный файл. Вы получитеTypeError
, если файл был открыт с помощьюwb
. В более старых версиях Python работаютw
nandwb
. Явное кодирование не требуется, так как выводjson.dump
является ASCII-only по умолчанию. Если вы можете быть уверены, что ваш код никогда не запускается на устаревших версиях Python, и вы и обработчик JSON-файла могут корректно обрабатывать не-ASCII-данные, вы можете указать один и установитьensure_ascii=False
. – phihag 19 April 2016 в 18:47