为什么关闭程序后我的词典没有更新?

问题描述

我正在尝试创建一个程序来为客人分配酒店房间号。分配后,在字典中,键的值应更新为“不可用”或“保留”。但是,事情是,在我关闭程序之后。那些已更新的房间号将重新变为“可用”。

是否可以更改该值,以便即使关闭程序也可以保持更新状态?

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函数中,您重写了整个文件,因此先前的ReservedUnavailable房间再次被标记为Available

以下是一个清晰的例子:

  1. 您启动程序
  2. 您预订了一个房间(例如101房间),它被标记为Reserved
  3. rooms.txt文件已保存为正确的值。
  4. 您停止程序

然后,当再次启动程序时:

  1. 将所有值设置为Available的字典被创建。这意味着即使房间101也回到了Available
  2. 您预订了其他任何房间(例如201)
  3. 字典已保存在您的文件中。但是请记住,在初始化字典时,所有房间再次标记为Available

问题是,在启动程序以实际加载字典中每个房间的状态时,您不会读取rooms.txt文件。

我还建议您删除用于保存文件的自定义数据结构,然后使用JSON文件。它将简化您的代码。