У меня есть вопрос относительно проблемы, с которой я столкнулся при использовании 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 мог мне помочь.
Мои экстрасенсорные способности говорят мне, что у вашего файла есть Спецификация UTF-8, и вам нужно открыть его с помощью encoding='utf-8-sig'.
@jwodder: нет.
@jwodder Я почти уверен, что json.load (и даже loads) обрабатывает UTF-8-sig; с тех пор… какая бы версия ни добавляла двоичные файлы (и bytes) в UTF-8 или UTF-16, она также обрабатывала UTF-8-sig, даже (хотя и не задокументировано) обработку файлов UTF-8-sig, открытых как текст UTF-8.






Вы открыли файл для записи:
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: нет, некоторые операционные системы не позволяют вам искать в любом месте файла до текущего размера файла (поэтому вы не можете изменить часть, которая была там, когда вы открывали файл).
Благодарю за точность. Я не думал о различиях, которые могут быть между ОС.
Большое спасибо! Это решило проблему. Я использовал w +, потому что файл, который я хочу открыть, может быть сначала создан, но я собираюсь разобраться с этим, используя оператор try, я думаю. Я прочитал это описание w +, но, должно быть, полностью прочитал ту часть, в которой говорится об усечении. `w + 'Открыт для чтения и записи. Файл создается, если он не существует, в противном случае он усекается. Поток располагается в начале файла. `
... опубликовать JSON?