首页 > 解决方案 > 让python作业字典程序正确保存和退出

问题描述

处理家庭作业问题。几乎所有代码都能正常工作,但由于某种原因似乎无法让我的程序正确保存和退出。这是给出的提示。

您应该创建一个程序来管理包含员工差旅费用的制表符分隔的文本文件。为公司出差的员工有 4 名,也只有 4 名:alice、bob、carl 和 diane。数据文件中的每条记录都将包含员工姓名、目的地城市、行驶里程和使用的加仑数。

完整的信用:

  • 您的程序应该正确地从制表符分隔的数据文件中读取和存储给定的数据。也就是说,我应该能够将您的程序与我的数据文件一起使用而不会出错。
  • 当数据被读入你的程序时,它应该被组织成一个字典列表,其中每个字典是文件中的一行,使用这些字典键:名称、城市、英里、加仑。
  • 您需要添加功能以显示用户的姓名、行驶的总里程、使用的总加仑数、平均 mpg 以及每英里 75 美分的总里程费用。这应该适用于您输入的 4 个正确用户名中的任何一个。
  • 除非您愿意,否则您不需要进行任何数据验证。
  • 当且仅当您的程序完全按照应有的方式运行时,如果您不使用串联,而是正确使用 python CSV 模块从文件中读取和写入数据,转换制表符分隔符,我将加分 10 分数据到字典,反之亦然。
  • 您或多或少需要使用讲义提供的基本代码。所有 4 个菜单选项都应该有效。
  • 使用格式将所有内容排列在整齐的列中以显示选项 1。

我的问题是我无法让第四个选项“保存并退出”正常运行。

def read_file(travels):
    salesperson_list = []
    with open("travels.txt", 'r') as infile:
        for line in infile.readlines():
            line = line.strip().split('\t')
            d = {}
            d['name'] = line[0]
            d['city'] = line[1]
            d['miles'] = eval(line[2])
            d['gallons'] = eval(line[3])
            salesperson_list.append(d)
    return salesperson_list


def display_all_data(data):
    print('{0:<8}{1:<15}{2:<8}{3:<8}'.format('Name', 'City', 'Miles', 'Gallons'))
    for row in data:
        print('{0:<8}{1:<15}{2:^8}{3:^8}'.format(row.get('name'), row.get('city'), \
                                                 row.get('miles'), row.get('gallons')))


def calculate_user_data(data):
    name = input('Enter user name: ').lower()
    total_miles = sum([row.get('miles') for row in data if row.get('name') == name])
    total_gallons = sum([row.get('gallons') for row in data if row.get('name') == name])
    cities = [row.get('city') for row in data if row.get('name') == name]
    mpg = total_miles/total_gallons
    owed = mpg*0.75
    print('Total miles travelled: {0}'.format(total_miles))
    print('Total gallons used: {0}'.format(total_gallons))
    print('mpg = ',mpg)
    print('expense = $', owed, 'at 75 cents per mile')


def add_a_trip(data):
    name = input('Input name: ').lower()
    city = input('Input city travelled: ').lower()
    miles = eval(input('Enter miles travelled: '))
    gallons = eval(input('Enter gallons used: '))
    d = {}
    d['name'] = name
    d['city'] = city
    d['miles'] = miles
    d['gallons'] = gallons
    data.append(d)
    print('Data added successfully')


def save_And_exit(data):
    with open('F:\\travels.txt','w') as outfile:
        for row in data:
            outfile.write(row.get('name')+'\t'+row.get('city')+'\t'+\
                      str(row.get('miles'))+'\t'+str(row.get('gallons'))+'\n')
    print('Saved to file')

def menu(salesperson_list):

    print('Menu options. Choose 1, 2, 3, or 4')
    print('[1] Display all trip data')
    print('[2] Calculate user data')
    print('[3] Add a trip')
    print('[4] Save an exit')
    while True:
        choice = input('Enter choice --> ')
        if choice == '1':
            display_all_data(salesperson_list)
        elif choice == '2':
            calculate_user_data(salesperson_list)
        elif choice == '3':
            add_a_trip(salesperson_list)
        elif choice == '4':
            save_And_exit(salesperson_list)
            print('Bye')
            break
        else:
            print('Invalid selection')


def main():
    salesperson_list = read_file('F:\\travels.txt')
    menu(salesperson_list)
main()

我只需要我的程序在没有全局变量的情况下正确保存和退出

标签: pythonpython-3.x

解决方案


推荐阅读