#python-3.x
#python-3.x
Вопрос:
У меня есть этот простой код:
import random
from db import db
print('Simplest Database! H for help')
def p():
key = input('Enter key: ')
value = input('Enter value: ')
db[key] = value
print(f'Pair {key}-{value} putted to DB!')
cli()
def g():
key = input('Enter key: ')
print(f'Key {key} is {db[key]}')
cli()
def l():
print('All database:')
for k, v in db.items():
print(f'{k} - {v}')
def r():
print('Random value: ')
print(random.choice(list(db.values())))
cli()
def h():
print('P to put data')
print('G to get data')
print('L to list all DB')
print('R to random value')
print('H to show this message')
print('Q to quit')
cli()
def cli():
cmd = input('> ')
if cmd == 'P':
p()
if cmd == 'G':
g()
if cmd == 'L':
l()
if cmd == 'R':
r()
if cmd == 'H':
h()
if cmd == 'Q':
print('Exiting, bye')
exit()
else:
print('Unexpected command!')
cli()
cli()
И файл БД:
db = {}
У меня есть две проблемы:
Когда я набираю L, cmd печатает базу данных, да, но затем печатает неожиданную команду!
И основная проблема:
Когда я меняю DB, все печатается, но файл не изменяется, и после перезапуска file db пуст!
Я совершенно не знаю, почему
Ответ №1:
Поскольку вы хотите, чтобы «Неожиданная команда!» печаталась только в том случае, если cmd
doens не соответствует ни одному из параметров, вы должны изменить все свои if
операторы elif
, кроме первого.
И вы хотите cli
быть меню, которое продолжает выполняться, вам следует подумать о том, чтобы изменить его на цикл. Таким образом, вам не нужно вызывать cli()
в конце всех ваших других функций.
И если вы хотите сохранить внесенные изменения db
, чтобы он отслеживал изменения между выполнением кода, я предлагаю сохранить его в текстовый файл.
Поскольку вы используете словарь, вы можете рассмотреть json
пакет. Вместо того, чтобы загружать ваш db
файл из файла python, вы можете записать две небольшие функции, одну для загрузки и одну для сохранения db
. Таким образом, вы убедитесь, что ваши данные будут сохранены после выхода из вашего меню.
Весь ваш новый код должен быть примерно таким
import random
import json
db = {}
my_db_file = 'db.json'
def load_data():
global db
try:
with open(my_db_file, 'r') as file:
db = json.load(file)
except FileNotFoundError:
pass
def save_data():
with open(my_db_file, 'w') as file:
json.dump(db, file)
def p():
key = input('Enter key: ')
value = input('Enter value: ')
db[key] = value
print(f'Pair {key}-{value} putted to DB!')
def g():
key = input('Enter key: ')
print(f'Key {key} is {db[key]}')
def l():
print('All database:')
for k, v in db.items():
print(f'{k} - {v}')
def r():
print('Random value: ')
print(random.choice(list(db.values())))
def h():
print('P to put data')
print('G to get data')
print('L to list all DB')
print('R to random value')
print('H to show this message')
print('Q to quit')
def cli():
cmd = input('> ')
while cmd != 'Q':
if cmd == 'P':
p()
elif cmd == 'G':
g()
elif cmd == 'L':
l()
elif cmd == 'R':
r()
elif cmd == 'H':
h()
else:
print('Unexpected command!')
cmd = input('> ')
else:
print('Exiting, bye')
save_data()
exit()
print('Simplest Database! H for help')
load_data()
cli()
Это почти то же самое, я только что внес исправления cli
, удалил его вызов из других функций, поскольку в нем больше нет необходимости, и добавил две новые функции для сохранения и загрузки ваших данных.
После первого запуска этого кода вы заметите новый файл, вызываемый db.json
в том же каталоге вашего скрипта python. Это ваша база данных, вы можете заглянуть в нее, если хотите проверить, сохранены ли данные так, как вы хотели.
Вот и все. Дайте нам знать, если у вас возникнут дополнительные вопросы!