问题描述
我正在尝试创建一个程序来为客人分配酒店房间号。分配后,在字典中,键的值应更新为“不可用”或“保留”。但是,事情是,在我关闭程序之后。那些已更新的房间号将重新变为“可用”。
是否可以更改该值,以便即使关闭程序也可以保持更新状态?
import math
f = open('room.txt','r+')
#Hotel Rooms
for i in range(1,7):
locals()['Level{}'.format(i)] = {} # Creating Dictionary
start = 101
for x in range(1,7):
for i in range(start,start + 10):
eval("Level" + str(x))[i] = 'Available' # Adding Values into Dictionary
start += 100
# heading function
def heading(number,header):
for i in range(60):
print('-',end = '')
print()
for i in range(number):
print('*',end = ' ')
print('\n' + header)
for i in range(number):
print('*',end = ' ')
print()
# customer details function
def customer():
print('''Room Types:
1 --> Single (Level 1)
2 --> Double (Level 2)
3 --> Triple (Level 3)
4 --> Quad (Level 4)
5 --> Queen (Level 5)
6 --> King (Level 6)
''')
room = input('Room Type: ')
name = input('Name: ')
hp = input('Mobile Number: ')
guests = input('Number of Guests: ')
arrival = input('Arrival Date(dd/mm/yyyy): ')
departure = input('Departure Date(dd/mm/yyyy): ')
confirm = input('Confirmation(Y/N): ')
conf(confirm,room,option)
# confirmation function + room for guest
def conf(con,num,opt):
if con == 'Y':
try:
for level,availability in eval('Level' + str(num)).items():
if availability == 'Available':
print('Guest Room Number:',level)
if option == '1':
eval('Level' + str(num))[level] = 'Reserved'
elif option == '2':
eval('Level' + str(num))[level] = 'Unavailable'
print('\nRoom Recorded!')
break
for i in range(1,7):
f.write('Level ' + str(i) + '\n')
for key in eval('Level' + str(i)):
f.write(str(key) + ": " + eval('Level' + str(i))[key] + '\n')
f.write('\n')
f.close()
except NameError:
print('\nInvalid Room Type.')
elif con == 'N':
print('\nRecord Not Recorded.')
else:
print('\nInvalid Confirmation.')
# sub-headings (options)
def options():
print('''
Choose one of the following options (0-3):
0 <-- Back to Main Menu.
1 --> Booking Engine
2 --> Check In
3 --> Check Out''')
while True:
cus = '* Customer Registration *'
num = math.ceil(len(cus)/2)
heading(num,cus)
options()
option = input('Enter your option: ')
# Booking Engine
if option == '1':
boo = '* Booking Engine *'
num = math.ceil(len(boo)/2)
heading(num,boo)
customer()
#Check In
elif option == '2':
chein = '* Check In *'
num = math.ceil(len(chein)/2)
heading(num,chein)
customer()
else:
print("\nInvalid Option.")
continue
解决方法
我还没有执行您的代码,但是从我看到的结果来看:
这些是代码的第一行:
f = open('room.txt','r+')
#Hotel Rooms
for i in range(1,7):
locals()['Level{}'.format(i)] = {} # Creating Dictionary
start = 101
for x in range(1,7):
for i in range(start,start + 10):
eval("Level" + str(x))[i] = 'Available' # Adding Values into Dictionary
start += 100
在这里,您将创建一个所有房间的字典,将所有房间标记为Available
。这意味着无论房间的当前值如何,都将再次将其标记为Available
。
然后在conf
函数中,您重写了整个文件,因此先前的Reserved
或Unavailable
房间再次被标记为Available
。
以下是一个清晰的例子:
- 您启动程序
- 您预订了一个房间(例如101房间),它被标记为
Reserved
-
rooms.txt
文件已保存为正确的值。 - 您停止程序
然后,当再次启动程序时:
- 将所有值设置为
Available
的字典被创建。这意味着即使房间101也回到了Available
- 您预订了其他任何房间(例如201)
- 字典已保存在您的文件中。但是请记住,在初始化字典时,所有房间再次标记为
Available
。
问题是,在启动程序以实际加载字典中每个房间的状态时,您不会读取rooms.txt
文件。
我还建议您删除用于保存文件的自定义数据结构,然后使用JSON文件。它将简化您的代码。