Ошибка Python json.load (файл) с допустимым JSON

У меня есть вопрос относительно проблемы, с которой я столкнулся при использовании json lib в Python.

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

import json

filename= '../Data/exampleFile.json'
histFile= open(filename, 'w+')
print(json.load(histFile))

Файл JSON, который я пытаюсь прочитать, действителен в соответствии с некоторым веб-сайтом, который я нашел: скриншот этой проверки, потому что я новичок и до сих пор не имею репутации ...

Я получаю следующее сообщение об ошибке:

File ".\testLoad.py", line 5, in <module>
print(json.load(histFile))
File "C:\Users\...\Python\Python37\lib\json\__init__.py", line 296, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "C:\Users\...\Python\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:\Users\...\Python\Python37\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\...\Python\Python37\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Хорошо, поэтому я считаю, что проблема не в файле, но json.load (файл) работает для меня в других случаях.

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

... опубликовать JSON?

Denziloe 07.09.2018 23:40

Мои экстрасенсорные способности говорят мне, что у вашего файла есть Спецификация UTF-8, и вам нужно открыть его с помощью encoding='utf-8-sig'.

jwodder 07.09.2018 23:42

@jwodder: нет.

Martijn Pieters 07.09.2018 23:43

@jwodder Я почти уверен, что json.load (и даже loads) обрабатывает UTF-8-sig; с тех пор… какая бы версия ни добавляла двоичные файлы (и bytes) в UTF-8 или UTF-16, она также обрабатывала UTF-8-sig, даже (хотя и не задокументировано) обработку файлов UTF-8-sig, открытых как текст UTF-8.

abarnert 08.09.2018 00:00
Почему в 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
4
2 448
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы открыли файл для записи:

histFile= open(filename, 'w+')
#                        ^^^^

Режим w сначала усекает файл, поэтому файл пуст (здесь не имеет значения, что файл также может быть прочитан, + следит за этим, но, тем не менее, файл усекается). См. Документация по функциям open():

'w': open for writing, truncating the file first)

В нем нет данных JSON для анализа. Вот почему исключение сообщает вам, что синтаксический анализ завершился неудачно в самом начале файла:

Expecting value: line 1 column 1 (char 0)

В первой строке, первом столбце нет данных.

Если вы хотите открыть файл как для чтения, так и для записи без, сначала усекая его, используйте 'r+' в качестве файлового режима.

Будет ли 'a' как открытый режим эквивалентен 'r+' в этом случае?

domochevski 08.09.2018 00:13

@domochevski: нет, некоторые операционные системы не позволяют вам искать в любом месте файла до текущего размера файла (поэтому вы не можете изменить часть, которая была там, когда вы открывали файл).

Martijn Pieters 08.09.2018 00:20

Благодарю за точность. Я не думал о различиях, которые могут быть между ОС.

domochevski 08.09.2018 00:24

Большое спасибо! Это решило проблему. Я использовал w +, потому что файл, который я хочу открыть, может быть сначала создан, но я собираюсь разобраться с этим, используя оператор try, я думаю. Я прочитал это описание w +, но, должно быть, полностью прочитал ту часть, в которой говорится об усечении. `w + 'Открыт для чтения и записи. Файл создается, если он не существует, в противном случае он усекается. Поток располагается в начале файла. `

Lukas 08.09.2018 10:34

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