1.需求:
1.程序启动后,给用户提供接口,允许用户重复查询股票行情(利用循环)
2.允许用户通过模糊查新股票名。如输入“啤酒”就把带啤酒的信息打印出来。
3.允许按股票价格,换手率,涨跌幅这几列筛选信息,如输入“价格>50”,则把价格大于50的股票打印出来,不用判断等于。
2.股票数据stock_data.txt(部分):
股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今,成交量,成交额,换手率,市盈率(TTM),股息率,市值
SH601778,N晶科,6.29,+1.92,+43.94%,+43.94%,259.66万,1625.52万,0.44%,亏损,-,173.95亿
SH688566,吉贝尔,52.66,+6.96,+15.23%,+122.29%,1626.58万,8.09亿,42.29%,89.34,-,98.44亿
SH688268,华特气体,88.80,+11.72,+15.20%,+102.51%,622.60万,5.13亿,22.87%,150.47,-,106.56亿
SH600734,实达集团,2.60,+0.24,+10.17%,-61.71%,1340.27万,3391.14万,2.58%,亏损,0.00%,16.18亿
SH900957,凌云B股,0.36,+0.033,+10.09%,-35.25%,119.15万,42.10万,0.65%,44.65,0.00%,1.26亿
2020-09-15
结尾更新了课上老师讲的优化代码
3.用到一个正则化查找字符串中的数字
既然是提取数字,那么数字的形式一般是:整数,小数,整数加小数;
所以一般是形如:———.————;
根据上述正则表达式的含义,可写出如下的表达式:”\d+.?\d*”;
·\d+ 匹配1次或者多次数字,注意这里不要写成*,因为即便是小数,小数点之前也得有一个数字;
·\.? 这个是匹配小数点的,可能有,也可能没有;
·\d* 这个是匹配小数点之后的数字的,所以是0个或者多个。
re.findall(r"\d+.?\d*")最后得到的是一个list。
4.代码部分(还待修改)
# 第一次尝试
import re
def LoopSerchName(dict, cls, index):
count = 0
for k, v in dict.items(): # 循环股票字典
if cls in v[index + 1]:
print(stoct_dict[k])
count += 1
print(f"找到{count}条")
def LoopSerchUpper(dict, index, thread):
count = 0
for k, v in dict.items(): # 循环股票字典
if len(re.findall(r"\d+\.?\d*", v[index])) == 0: # 如果发现没有数字指标,就认为是负值
value = float(-99)
else:
value = float(re.findall(r"\d+\.?\d*", v[index])[0]) # 知识点1
if value > thread:
print(stoct_dict[k])
count += 1
print(f"找到{count}条")
def LoopSerchLower(dict, index, thread):
count = 0
for k, v in dict.items(): # 循环股票字典
if len(re.findall(r"\d+\.?\d*", v[index])) == 0: # 如果发现没有数字指标,就认为是负值
value = float(-99)
else:
value = float(re.findall(r"\d+\.?\d*", v[index])[0]) # 知识点1
if value < thread:
print(stoct_dict[k])
count += 1
print(f"找到{count}条")
if __name__ == '__main__':
stoct_list = []
stoct_dict = {}
f = open("stock_data", 'r', encoding='utf-8')
stoct_list = f.readline()
stoct_list = stoct_list.strip().split(',') #
# print(stoct_list)
num = 0
for line in f:
line = line.strip().split(',')
stoct_dict[num] = line # 把字典的键值设置为序号
num += 1
# print(stoct_dict)
while True:
serch_info = input("股票查询接口>>:")
serch_name = serch_info.split('<')[0].split('>')[0] # 获取输入信息最前面的名字
serch_index = 0
for i in range(len(stoct_list)):
if serch_name in stoct_list[i]:
serch_index = i # 获取查询的信息在哪一列
break
if ">" in serch_info:
thread = serch_info.split('>')[-1] # 两次过滤获取阈值,此时是str格式
thread = float(re.findall(r"\d+\.?\d*", thread)[0]) # 正则化查找数字部分,转为float数字格式
LoopSerchUpper(stoct_dict, serch_index, thread)
print()
elif "<" in serch_info:
thread = serch_info.split('>')[-1] # 两次过滤获取阈值,此时是str格式
thread = float(re.findall(r"\d+\.?\d*", thread)[0]) # 正则化查找数字部分,转为float数字格式
LoopSerchLower(stoct_dict, serch_index, thread)
print()
else:
LoopSerchName(stoct_dict, serch_name, serch_index)
"""
遗留问题:
1.成交额单位有万,亿,在计算thread的时候还需要具体细分.
2.市盈率和股息率中有些是“亏损”“-”,没有数值,需要具体区分是否有数字,这里我判断如果亏损的时候就是负值.
3...
"""
5.推荐一首姐姐的《あの微笑みを忘れないで》,忘记发生在自己身上的挫折,微笑着迎接新的一天吧,我可以的!
优化后的代码
import re ''' 官方思路 1.把股票存到内存 2.实现模糊查询 3.处理复杂查询 3.1进行语法的合法性验证 验证名称合法性,验证符号合法性,验证数值合法性 ''' f = open("stock_data",encoding="UTF-8") headers = f.readline().strip().split(',') stock_dict = {} for line in f: line = line.strip().split(',') stock_dict[line[0]] = line while True: cmd = input("股票查询接口>>").strip() if not cmd:continue ''' # 2.模糊查询 ''' print(headers) for sid,s_data in stock_dict.items(): s_name = s_data[1] if cmd in s_name: print(s_data) ''' # 3.复杂公式处理, a = 当前价>50 #验证列名合法,符号合法性,数值合法性 1.验证公式基本合法 2.验证列名合法 3.验证符号合法 4.验证右边值合法 ''' valid_cols = ["当前价","涨跌幅","换手率"] syntax_parser = re.split("[<>]",cmd) if len(syntax_parser) == 2: # 3.1公式基本合法 filter_column, filter_val = syntax_parser if filter_column in valid_cols: # 3.2 try: filter_val = float(filter_val) # 3.4有可能报错 filter_col_index = headers.index(filter_column) # 4.取到列名下标 for sid,s_data in stock_dict.items(): rel_filter_col_val = float(s_data[filter_col_index].strip('%')) # 取梅列的实际值 if ">" in cmd: if rel_filter_col_val > filter_val: # 匹配上了 print(s_data) if "<" in cmd: if rel_filter_col_val < filter_val: # 匹配上了 print(s_data) except ValueError as e: print("出错了:",e)