Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Не удается прочитать данные из файла JSON

#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)

Комментариев нет:

Отправить комментарий