Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 13, 2016 13:43:15

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

Всем доброго времени суток!
Есть проблемка - для удобства использования нужно в файл и из файла записывать и считывать словарь. Выбрал json. И вот когда считывается такое, например содержимое, то все нормально:

{'id': 0, 'df': 78}
А вот когда записываешь словарь в файл, то в него записывается, такое:
{u'df': 65, u'id': 5}
соответственно при использовании к такому словарю json.loads выдает ошибку:
Traceback (most recent call last):
  File "C:\Users\VMR\Desktop\library\Library.py", line 215, in <module>
    app = MyApp()
  File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8631, in __init__
    self._BootstrapApp()
  File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8196, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "C:\Users\VMR\Desktop\library\Library.py", line 209, in OnInit
    style=wx.DEFAULT_FRAME_STYLE^wx.MAXIMIZE_BOX^wx.RESIZE_BORDER)
  File "C:\Users\VMR\Desktop\library\Library.py", line 22, in __init__
    self.properties = json.loads(file.read())
  File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 2 (char 1)

Как разобраться с этим юникодом?

Офлайн

#2 Фев. 13, 2016 14:55:38

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

A.N.Onim
А вот когда записываешь словарь в файл, то в него записывается, такое:
Это как вы такое получили?
import json
a={u'id': 0, u'df': 78}
json.dump(a,open("out.json","w"))

в файле:
{"df": 78, "id": 0}



Офлайн

#3 Фев. 13, 2016 15:10:13

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

self.properties['id'] += 1
file = open("./data/preferences.txt", 'wt')
file.write(str(self.properties))
file.close()

Я так записываю) Я так понял такие файлы нужно записывать с помощью json.dump ?

UPD: агась, прочитал про сериализацию и десериализацию. Вот только вопрос - функции dump и dumps, отличается тем что первая записывает в файло-подобные обьекты, а вторая просто возвращает в битном коде ? И еще это первая сериализирует - в двоичный код, а потом в человеческом виде записывает в файл? А смысл тогда переводить битный код?

Отредактировано A.N.Onim (Фев. 13, 2016 15:33:55)

Офлайн

#4 Фев. 13, 2016 15:47:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

Какой нафиг битный код, JSON - текстовый формат.



Офлайн

#5 Фев. 13, 2016 15:54:14

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

FishHook
Какой нафиг битный код, JSON - текстовый формат.
Это я знаю. Но вот что пишет документация:
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding=“utf-8”, default=None, sort_keys=False, **kw)
Сериализует obj как форматированный JSON поток в fp (файло-подобный объект, поддерживающий метод .write()) используя эту таблицу преобразования.

теперь читаю википедию:
Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.

Выходит, я не так все понял. Так что же делает функция dump ?

Офлайн

#6 Фев. 13, 2016 15:59:22

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

Что не так? Есть код:

self.properties = json.loads(open("./data/preferences.txt").read())
есть файл “./data/preferences.txt”:
{'id': 8, ‘df’: 4}
а выдает все ту же ошибку:

Офлайн

#7 Фев. 13, 2016 16:06:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

хоспаде

self.properties = json.loads("./data/preferences.txt")



Офлайн

#8 Фев. 13, 2016 16:13:04

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

Все решил, все получилось! Спасибо. Просто нужно кавычки в файле ставить двойные, если вручную пишешь файл и вибирать правильно ф-цию dump/dumps.

Офлайн

#9 Фев. 13, 2016 17:32:39

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

Если вы собираетесь самостоятельно файл вбивать то документацию по формату прочитайте.
http://www.json.org/json-ru.html
Или проверйте то что написали.
http://jsonlint.com/



Отредактировано doza_and (Фев. 13, 2016 17:38:21)

Офлайн

#10 Фев. 13, 2016 17:37:14

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема со считыванием JSON и юникодом.

doza_and, спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version