2014-11-21 1 views
0

Я делаю простую программу-обертку вокруг программного обеспечения, и эта оболочка будет, помимо прочего, анализировать конфигурационный файл JSON, который будет кодироваться пользователем как способ для пользователя укажите определенные настройки для программы.Неожиданное поведение, проявляемое модулем JSON Python

В рамках программы, у меня есть следующие строки кода:

with open(os.path.join(args.config_bin_dir, 'basic_config.json'), 'r') as jsondata : 
    print "JSON File contents:", jsondata.read() 
    basic_config.update(json.load(jsondata)) 
    print "The basic_config after updating with JSON:", basic_config 
jsondata.close() 

basic_config объект является словарем объект, который получает построен где-то на вершине раньше в программе, и здесь я хочу добавьте новые пары ключ-значение слова, полученные при разборе файла конфигурации пользователя JSON в объекте-словаре basic_config.

Когда программа запускается, я получаю следующее сообщение об ошибке, часть которого выглядит следующим образом:

File "path/to/python/script.py", line 42, in main 
    basic_config.update(json.load(jsondata)) 
File "/usr/lib/python2.7/json/__init__.py", line 290, in load 
    **kw) 
File "/usr/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

Я очень озадачен этой ошибки, но я заметил, что он уходит, пока Я удалить строку print "JSON File contents:", jsondata.read() и запустить код либо как:

with open(os.path.join(args.config_bin_dir, 'basic_config.json'), 'r') as jsondata : 
    # print "JSON File contents:", jsondata.read() 
    basic_config.update(json.load(jsondata)) 
    print "The basic_config after updating with JSON:", basic_config 
jsondata.close() 

или

with open(os.path.join(args.config_bin_dir, 'basic_config.json'), 'r') as jsondata : 
    # print "JSON File contents:", jsondata.read() 
    basic_config.update(json.load(jsondata)) 
    # print "The basic_config after updating with JSON:", basic_config 
jsondata.close() 

Я все еще получаю ту же ошибку, если я закомментировать строку после json.load метода:

with open(os.path.join(args.config_bin_dir, 'basic_config.json'), 'r') as jsondata : 
    print "JSON File contents:", jsondata.read() 
    basic_config.update(json.load(jsondata)) 
    # print "The basic_config after updating with JSON:", basic_config 
jsondata.close() 

Так что я предполагаю, что он должен делать с вызовом read метода объекта JSON файла перед разбором, что тот же файл. Может ли кто-нибудь объяснить мне, почему это так, и ошибаюсь ли я в причине ошибки?

спасибо!

ответ

0

Когда вы вызываете read() на дескриптор файла, его текущая позиция чтения продвинута до конца файла. Это отражает поведение базовых файловых дескрипторов. Вы можете вернуться к началу файла через jsondata.seek(0, 0).

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

  • Нет связанных вопросов^_^