路飞学城系列:第2章 数据类型&文件操作-作业(2)【股票信息查询程序_列表版】

# coding: utf-8

"""

作业题目:股票信息查询程序
    作业需求:
    1 程序启动后,给用户提供查询接口,允许用户重复查股票行情信息(用到循环)
    2 允许用户通过模糊查询股票名,比如输入“啤酒”, 就把所有股票名称中包含“啤酒”的信息打印出来
    3 允许按股票价格、涨跌幅、换手率这几列来筛选信息,
         比如输入“价格>50”则把价格大于50的股票都打印,输入“市盈率<50“,则把市盈率小于50的股票都打印,不用判断等于。
    stock_data.txt 此文件请从课件中下载。

思路提示:
加载文件内容到内存,转成dict or list结构,然后对dict or list 进行查询等操作。 这样以后就不用每查一次就要打开一次文件了,效率会高。

重要收获:
作业中提到了一个思路,可以把文件内容全部读取出来并存储,再去对数据进行频繁读取和写入(有效避免了频繁读取),全部读写操作完成后,再统一写入到文件。
之前写的练习(用户登录),也可以按照该思路,重写一遍。

"""

# 读取文件中存储的股票信息
with open("stock_data.txt", mode="r", encoding="utf-8") as f:
    # 存放读取到的股票信息(注意:字典的查询效率最高,建议优先使用,本次暂不用)
    stock_data_list = f.readlines()
# 是否退出程序
is_not_exit = True
# 取出标题行,并把标题行从列表中移除
title_list = stock_data_list.pop(0).split()
# 列出标题,供用户选择
print(title_list)

# 通过while循环执行逻辑
while is_not_exit:

    # 接收用户输入
    user_input = input("股票查询接口>>")
    # 找到的记录条数
    record_num = 0

    # 循环取出每1行股票记录
    for line in stock_data_list:
        # 把每行取出来的字符串,转为列表
        line = line.split()

        # 通过股票名称模糊查询,比如输入“啤酒”
        if user_input in line[2]:
            print(line)
            record_num += 1

        # 用户输入为>时,允许按 价格-3、涨跌幅-4、换手率-13 进行筛选 ,比如输入“价格>50”则把价格大于50的股票都打印
        elif ">" in user_input:
            # 把用户输入的表达式,转为列表,如["价格","50"]
            user_input_list = user_input.split(">")
            # 用户输入的标题
            user_input_title = user_input_list[0]
            # 用户输入的判断值
            user_input_value = user_input_list[1]
            # 获得要检索的列索引
            user_input_index = title_list.index(user_input_title)
            # 当前取出的所在行、对应标题列的值
            line_value = line[user_input_index]

            # 把输入值中%去除
            if "%" in user_input_value:
                user_input_value = user_input_value.replace("%", "")
            # 当前取出的所在行的值中%去除
            if "%" in line_value:
                line_value = line_value.replace("%", "")

            # 判断筛选,并且打印记录,更新记录数
            if float(line_value) > float(user_input_value):
                print(line)
                record_num += 1

        # 用户输入为<时,允许按 价格-3、涨跌幅-4、换手率-13 ,比如输入“价格<50”则把价格小于50的股票都打印
        elif "<" in user_input:
            # 把用户输入的表达式,转为列表,如["价格","50"]
            user_input_list = user_input.split("<")
            # 用户输入的标题
            user_input_title = user_input_list[0]
            # 用户输入的判断值
            user_input_value = user_input_list[1]
            # 获得要检索的列索引
            user_input_index = title_list.index(user_input_title)
            # 当前取出的所在行的值
            line_value = line[user_input_index]

            # 把输入值中%去除
            if "%" in user_input_value:
                user_input_value = user_input_value.replace("%","")
            # 当前取出的所在行的值中%去除
            if "%" in line_value:
                line_value = line_value.replace("%", "")

            # 判断筛选,并且打印记录,更新记录数
            if float(line_value) < float(user_input_value):
                print(line)
                record_num += 1

        # 退出,输入q
        elif user_input == "q":
            print("谢谢使用!")
            is_not_exit = False
            break

    # 打印找到记录条数
    print("找到{0}条".format(record_num))
原文地址:https://www.cnblogs.com/lizhen416/p/13662203.html