Исключения обработки Python при чтении файлов JSON

Я включаю 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 таким образом — не очень хорошая практика. Я подозреваю, что знаю проблему, но не могу сказать, не видя ее.

roganjosh 09.04.2019 20:46

Если это действительный файл json, то исключение не сработает. Вызывается ли print(j)?

alex067 09.04.2019 20:46

@ alex067 alex067 Это не часть исключения

Chris 09.04.2019 20:49

Пожалуйста, предоставьте пример того, как выглядит файл, чтобы мы могли видеть, что такое issye

Devesh Kumar Singh 09.04.2019 20:49

Если я правильно понимаю, оба оператора работают нормально, когда вы можете их использовать по отдельности, но когда вы вызываете его таким образом, оператор exclude не оценивается, и j не устанавливается. Я предполагаю, что всякий раз, когда в диспетчере контекста возникает исключение (в операторе with), он закрывает ресурс, поэтому он не может прочитать r.

schilli 09.04.2019 20:51

@schilli диспетчер контекста не будет вызывать __exit__, пока блок with не будет закрыт

juanpa.arrivillaga 09.04.2019 20:55

@schilli нет, вы можете обрабатывать исключения по своему усмотрению в диспетчере контекста. Подозреваю, что вторая попытка j тоже не удалась

roganjosh 09.04.2019 20:55

Вам необходимо предоставить минимальный воспроизводимый пример. Мне до сих пор непонятно, какое у вас поведение ожидание.

juanpa.arrivillaga 09.04.2019 20:56

@roganjosh или блок try никогда не выдают исключение.

juanpa.arrivillaga 09.04.2019 20:56

@juanpa.arrivillaga хорошо, тогда я действительно сбит с толку, потому что думал, что проблема никогда не достигнет print(j). Я не могу даже догадаться о проблеме без него, я думаю.

roganjosh 09.04.2019 20:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
10
2 822
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оператор 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.

Другие вопросы по теме