Запись в файл JSON и чтение из него

Я пишу сценарий, чтобы проверить, существует ли файл json. Если это так, то он использует функцию flask render_template, чтобы использовать данные для загрузки веб-страницы. В противном случае сценарий запрашивает базу данных, помещает данные в формате json, а затем создает и записывает в файл json. Вот пример кода.

from flask import render_template
import json
import os

title = "Tests"
jsonFile = "tests.json"
if os.path.exists(jsonFile):
    return render_template('tests.html', title=title, data='tests')
else:
    data = '{"tests":[{"id":"1","ip_addy":"IP1","name":"name1"},
                      {"id":"2","ip_addy":"IP2","name":"name2"},
                      {"id":"3","ip_addy":"IP3","name":"name3"}
                     ]}'
    with open(jsonFile, "w+") as f:
        json.dump(data, f)
    f.close()
    return render_template('tests.html', title=title, data=data)

Он отлично записывает в файл test.json, но когда я перезагружаю страницу tests.html после создания test.json, html сообщает, что нет записей для отображения. Я неправильно создал файл json?

близко (ж) нормально? Для меня python жалуется, но может быть, в python 3.6 close (f) превратился в f.close (). Также в вашем случае, если jsonFile существует в начале скрипта, но пуст, он будет отображаться с данными как «тест».

Simon Johansson 25.04.2018 22:08

Спасибо, Саймон. На самом деле у меня был f.close (), а не close (f). Файл json не пустой.

PyNerd 25.04.2018 22:14

Затем, если он существует, вы визуализируете шаблон в операторе if. и data = 'test' в вашем шаблоне. Если вы хотите прочитать рендеринг с данными в файле, вы должны попытаться прочитать содержимое файла перед рендерингом, передав его с помощью первого оператора.

Simon Johansson 25.04.2018 22:19
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
753
2

Ответы 2

Как упоминает @Simon Johansson, похоже, проблема в том, что вы не читаете содержимое файла. Мне кажется, что именно это изменение работает.

@app.route('/test')
def test():
    title = "Tests"
    jsonFile = "tests.json"
    if os.path.exists(jsonFile):
        file_data = ""
        try:
            with open(jsonFile) as f:
                file_data = f.read()
        except:
            file_data = "could not read file"
        return render_template('tests.html', title=title, data=file_data)
    else:
        data = {"tests":[{"id":"1","ip_addy":"IP1","name":"name1"},
                          {"id":"2","ip_addy":"IP2","name":"name2"},
                          {"id":"3","ip_addy":"IP3","name":"name3"}
                         ]}
        with open(jsonFile, "w+") as f:
            json.dump(data, f)
        f.close()
        return render_template('tests.html', title=title, data=data)

Я попытался изменить данные файла после записи, и измененные данные отображаются правильно, указывая, что данные считываются из файла нормально, если он есть.

Я использовал простые шаблоны \ tests.html

<html><head><title>{{title}}</title></head>
<body>Data:<br>{{data}}</body>
</html>

Спасибо. Я сделал это вместе с заменой file_data = f.read на file_data = json.load (f). Тогда он работал правильно.

PyNerd 26.04.2018 16:44

Это решение проблемы, спасибо Саймону и Дж. Фэй. Данные должны быть записаны и прочитаны как json.

@app.route('/test')
def test():
    title = "Tests"
    jsonFile = "tests.json"
    if os.path.exists(jsonFile):
        file_data = ""
        try:
            with open(jsonFile) as f:
                file_data = json.load(f)
            f.close()
        except:
            file_data = "could not read file"
        return render_template('tests.html', title=title, data=file_data)
    else:
        data = {"tests":[{"id":"1","ip_addy":"IP1","name":"name1"},
                         {"id":"2","ip_addy":"IP2","name":"name2"},
                         {"id":"3","ip_addy":"IP3","name":"name3"}
                         ]}
        with open(jsonFile, "w+") as f:
            json.dump(data, f)
        f.close()
        return render_template('tests.html', title=title, data=data)

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