Я включаю try... except...
при загрузке файла JSON. Мой код:
with open(file,'r',encoding='utf-8') as r:
try:
j = json.load(r)
except:
j = json.loads('['+r.read().replace('}{','},{')+']')[0]
print(j)
Однако j
со стороны except
никогда не читается. Если я запущу код except
отдельно, я смогу напечатать j без проблем.
Обновлять:
Если JSON не запускается json.load(r)
, выдается сообщение об ошибке Extra data: line 1 column 106362 (char 106361)
. В этом случае мне нужно немного «изменить» файл, передав JSON в часть except
. Однако print(j)
возвращает пустой список []
вместо настоящего JSON.
Я новичок в Python, просто интересно, есть ли у кого-нибудь идеи о том, что мне делать, чтобы try...except...
работал правильно?
Большое спасибо!
Если это действительный файл json, то исключение не сработает. Вызывается ли print(j)?
@ alex067 alex067 Это не часть исключения
Пожалуйста, предоставьте пример того, как выглядит файл, чтобы мы могли видеть, что такое issye
Если я правильно понимаю, оба оператора работают нормально, когда вы можете их использовать по отдельности, но когда вы вызываете его таким образом, оператор exclude не оценивается, и j не устанавливается. Я предполагаю, что всякий раз, когда в диспетчере контекста возникает исключение (в операторе with), он закрывает ресурс, поэтому он не может прочитать r.
@schilli диспетчер контекста не будет вызывать __exit__
, пока блок with не будет закрыт
@schilli нет, вы можете обрабатывать исключения по своему усмотрению в диспетчере контекста. Подозреваю, что вторая попытка j
тоже не удалась
Вам необходимо предоставить минимальный воспроизводимый пример. Мне до сих пор непонятно, какое у вас поведение ожидание.
@roganjosh или блок try никогда не выдают исключение.
@juanpa.arrivillaga хорошо, тогда я действительно сбит с толку, потому что думал, что проблема никогда не достигнет print(j)
. Я не могу даже догадаться о проблеме без него, я думаю.
Оператор try j = json.load(r)
неявно читает файл, перемещая курсор файла в конец. Это означает, что повторное чтение файла выводит пустую строку, поскольку курсор уже находится в конце файла.
Следовательно, решением будет сбросить курсор с помощью seek(0)
:
with open(file,'r',encoding='utf-8') as r:
try:
j = json.load(r)
except:
r.seek(0)
j = json.loads('['+r.read().replace('}{','},{')+']')[0]
print(j)
Мне также потребовались некоторые усилия по отладке, но с помощью надлежащего инструмента отладки в любой среде IDE вы могли видеть, что файл r был пустым при вводе инструкции exclude.
Пожалуйста, покажите фрагмент файла. Разделять JSON таким образом — не очень хорошая практика. Я подозреваю, что знаю проблему, но не могу сказать, не видя ее.