2013-06-04 2 views
1

У меня есть этот список строк ..JSON и кодировать строки

mylist = [u"čeština", u"maďarština", u"francouština"] 

мне нужно сбросить его в файл, я использую JSON для этого

text = json.dumps(mylist) 
FILE = open("file.txt", 'w') 
FILE.write(text) 
FILE.close() 

Но когда я открываю файл в редакторе (с utf-8) я вижу

["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"] 

Когда я прочитал список из файла, я получу правильные значения. Но этот файл должен отображаться также пользовательский Фридли, и я ожидаю ..

["čeština", "maďarština", "francouština"] 

или по крайней мере

[u"čeština", u"maďarština", u"francouština"] 
+1

Не используйте 'list' как имя переменной, так как это зарезервированное ключевое слово в python. –

+0

Возможно, вам стоит рассмотреть использование yaml – oleg

+0

: отредактировано: список -> mylist – Meloun

ответ

6

Когда вы сделаете json.dumps([u"čeština", u"maďarština", u"francouština"]), вы получите строку '["\\u010de\u0161tina", "ma\\u010far\u0161tina", "francou\\u0161tina"]' (с использованием действительной строковой литературной формы Python). Прогибы \u - это то, как Unicode представлен в JSON, а модуль JSON Python будет преобразовывать все символы не-ascii в экраны Unicode по умолчанию. Вы можете отключить это поведение, используя ensure_ascii=False в аргументах json.dumps().

Вот несколько примеров, первое поведение по умолчанию:

>>> json.dumps(lst) 
'["\\u010de\\u0161tina", "ma\\u010far\\u0161tina", "francou\\u0161tina"]' 
>>> print json.dumps(lst) 
["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"] 

И ensure_ascii=False:

Теперь, чтобы убедиться, что вы пишете эту строку Unicode с использованием UTF-8 можно использовать модуль codecs:

import codecs, json 
lst = [u"čeština", u"maďarština", u"francouština"] 
json.dump(lst, codecs.open('file.txt', 'w', 'utf-8'), ensure_ascii=False) 

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

+0

+1 для подробных примеров. –

+0

Действительно хороший ответ! Спасибо. – Meloun

4

u"čeština не является действительным JSON. Насколько мне известно, у вас не может быть многобайтовых символов в строках JSON (т. Е. Оно также неверно), но я не могу это сделать.

["\u010de\u0161tina"] действителен JSON. Когда он разобран, символы UTF-8 могут быть декодированы из частей \u. Для некоторого спокойствия откройте консоль браузеров, введите "\u010de\u0161tina" и нажмите Введите и увидите строку, которая будет напечатана.

Смежные вопросы