#python #json
Есть простой файл JSON { "foo": "123" } Попытка прочитать его с помощью кода storage = dict() storage_path = os.path.join(tempfile.gettempdir(), 'storage.data') with open(storage_path, 'r', encoding='utf-8') as json_file: if json_file.read(): storage = json.load(json_file) При попытке исполнения выбрасывает с ошибкой json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) Попытки иначе читать файл с помощью loads к результату тоже не приводят, в чем может быть проблема?
Ответы
Ответ 1
Командой if json_file.read(): вы читаете весь файл, так что указатель позиции для последующего чтения перемещен за конец файла, а последующая команда не может уже читать ничего. Добавьте после json_file.read() команду json_file.seek(0) для возвращения указателя на позицию 0 - начало файла: if json_file.read(): json_file.seek(0) storage = json.load(json_file) Примечание: Не нужна вам команда storage = dict().Ответ 2
А зачем вы делаете if json_file.read(): ? У вас файл оказывается прочитан до конца, и в json.load он будет читаться именно с этой позиции, то есть будет получаться пустая строка. Либо уберите проверку; либо, если очень хочется проверять, что файл не пуст, - сначала вычитывайте его в строковую переменную, а потом джсон берите из неё, используя loads вместо load: with open(storage_path, 'r', encoding='utf-8') as json_file: data = json_file.read() if data: storage = json.loads(data)Ответ 3
Вот так должно работать: storage = dict() storage_path = os.path.join(tempfile.gettempdir(), 'storage.data') with open(storage_path, 'r', encoding='utf-8') as json_file: storage = json.load(json_file) Подозреваю, что проблема в этой проверке if json_file.read():. json_file ведет себя так же как и генераторы в Python. To есть, если считать с него все строки один раз, то в следующий раз уже нечего будет считывать. В этом можно убедиться на примере. Создайте файл "data.json" и попробуйте дважды считать с него данные. import json with open('data.json', 'r', encoding='utf-8') as json_file: a = json_file.read() b = json_file.read() print('a: ', a) print('b: ', b)
Комментариев нет:
Отправить комментарий