[Python学习日记-28] 开发基础练习1——股票查询程序
简介
题目及效果参考
源码与解析
简介
该练习使用了列表、字典、字符串等之前学到的数据类型,用于巩固实践之前学习的内容,题目当中使用到的数据均摘录与东方财富网,最好在学习完前面的知识点之后花两天时间自己做一下,然后再看该篇文章中的答案。
题目及效果参考
一、题目
以下为股票数据源,请把它存入 stock_data.txt 当中
序号 代码 名称 价格 涨跌幅 涨跌额 5分钟涨跌额 今开 昨收 最高 最低 成交量 成交额 换手率 量比 委比 振幅 市盈率 流通市值 总市值 每股收益 净利润 主营收
1 600199 金种子酒 6.48 10.02% 0.59 0.00% 5.91 5.89 6.48 5.88 25.68万 1.61亿 4.61% 6.78 100.00% 10.19% 1661.5 36.01亿 36.01亿 0.00 162.4万 7.98亿
2 000860 顺鑫农业 54.69 10.00% 4.97 0.00% 53.00 49.72 54.69 51.12 20.18万 10.78亿 3.54% 8.30 100.00% 7.18% 41.9 312.0亿 312.0亿 1.30 7.44亿 120.7亿
3 603589 口子窖 51.80 8.21% 3.93 1.02% 48.11 47.87 51.80 48.00 37304 1.88亿 0.62% 4.33 49.82% 7.69% 22.8 309.4亿 309.4亿 2.26 11.41亿 32.07亿
4 000596 古井贡酒 98.88 8.09% 7.40 0.78% 92.47 91.48 99.88 92.00 20075 1.94亿 0.52% 2.46 -66.85% 8.61% 31.0 379.3亿 497.9亿 3.19 12.56亿 67.62亿
5 603369 今世缘 27.88 8.06% 2.08 0.12% 25.80 25.80 28.08 25.80 10.59万 2.86亿 0.84% 2.90 -46.05% 8.84% 30.5 350.0亿 350.0亿 0.92 10.29亿 31.59亿
6 600559 老白干酒 18.28 7.59% 1.29 -0.29% 17.06 16.99 18.59 16.99 17.72万 3.16亿 2.87% 4.98 -61.26% 9.42% 38.1 112.2亿 126.3亿 0.48 2.44亿 24.31亿
7 000568 泸州老窖 57.10 7.19% 3.83 -0.47% 54.40 53.27 57.88 54.40 14.35万 8.11亿 0.98% 4.12 1.20% 6.53% 25.3 833.9亿 836.3亿 2.26 27.51亿 92.63亿
8 000799 酒鬼酒 21.82 6.86% 1.40 0.10% 21.10 20.42 22.05 21.10 18.65万 4.01亿 5.74% 5.88 72.10% 4.65% 32.1 70.90亿 70.90亿 0.68 1.61亿 7.60亿
9 600809 山西汾酒 58.39 6.14% 3.38 0.05% 55.50 55.01 58.54 55.15 72118 4.15亿 0.83% 4.00 35.20% 6.16% 36.1 506.3亿 506.3亿 1.62 12.64亿 69.15亿
10 603919 金徽酒 15.16 5.94% 0.85 -0.35% 14.32 14.31 15.55 14.20 55030 8229万 1.51% 4.20 -78.50% 9.43% 21.4 55.18亿 55.18亿 0.71 2.59亿 14.62亿
11 002461 珠江啤酒 5.96 5.49% 0.31 0.35% 5.69 5.65 6.00 5.69 10.57万 6202万 0.78% 4.55 -48.27% 5.49% 38.7 81.08亿 131.9亿 0.15 3.17亿 33.07亿
12 000858 五粮液 83.05 5.42% 4.27 -0.33% 78.68 78.78 83.38 78.50 28.78万 23.53亿 0.76% 3.31 -41.49% 6.19% 26.1 3152亿 3223亿 3.18 94.94亿 292.5亿
13 002304 洋河股份 117.19 4.33% 4.86 -0.06% 113.11 112.33 117.50 113.11 56404 6.54亿 0.45% 3.08 -35.91% 3.91% 21.8 1473亿 1766亿 5.37 70.39亿 209.6亿
14 603198 迎驾贡酒 17.85 4.32% 0.74 0.58% 17.12 17.11 18.06 17.08 68543 1.21亿 0.86% 3.75 12.86% 5.73% 19.4 142.8亿 142.8亿 0.92 4.98亿 24.37亿
15 002646 青青稞酒 13.00 4.25% 0.53 0.32% 12.48 12.47 13.09 12.48 40479 5203万 0.90% 3.84 40.55% 4.89% -49.8 58.50亿 58.50亿 -0.26 8680万 9.52亿
16 200596 古井贡B 54.28 4.18% 2.18 0.15% 52.10 52.10 55.00 52.10 2166 1169万 0.06% 2.96 -16.18% 5.57% 17.0 208.2亿 273.3亿 3.19 12.56亿 67.62亿
17 600197 伊力特 19.49 4.11% 0.77 0.85% 18.67 18.72 19.72 18.50 12.59万 2.44亿 2.85% 3.55 -71.57% 6.52% 22.2 85.95亿 85.95亿 0.88 2.90亿 14.98亿
18 600702 舍得酒业 29.90 4.00% 1.15 -0.21% 28.81 28.75 30.30 28.81 13.12万 3.89亿 3.98% 4.22 -57.22% 5.18% 29.3 98.53亿 100.8亿 1.02 3.42亿 22.12亿
19 603711 香飘飘 27.15 3.78% 0.99 -0.76% 26.16 26.16 27.60 25.60 14216 3788万 3.05% 1.62 -49.38% 7.65% 37.7 12.57亿 113.9亿 0.72 8400万 16.80亿
20 600132 重庆啤酒 34.70 3.64% 1.22 0.93% 33.64 33.48 34.70 33.64 17215 5894万 0.36% 2.86 42.98% 3.17% 42.3 167.9亿 167.9亿 0.82 3.85亿 29.24亿
21 600300 维维股份 3.46 3.59% 0.12 0.00% 3.36 3.34 3.49 3.35 14.09万 4830万 0.84% 2.04 -22.22% 4.19% 63.3 57.85亿 57.85亿 0.05 9824万 37.28亿
22 600059 古越龙山 8.11 3.58% 0.28 -0.51% 7.85 7.83 8.20 7.80 46570 3742万 0.57% 2.95 10.46% 5.11% 38.6 65.57亿 65.57亿 0.21 1.15亿 12.75亿
23 600600 青岛啤酒 40.30 3.49% 1.36 0.03% 39.31 38.94 40.37 39.00 51910 2.08亿 0.73% 3.43 -77.14% 3.52% 36.4 280.2亿 544.0亿 1.10 21.00亿 236.4亿
24 000995 *ST皇台 4.57 3.39% 0.15 0.23% 4.47 4.42 4.57 4.41 26640 1196万 1.50% 2.13 -35.66% 3.62% -5.0 8.11亿 8.11亿 -0.92 -4190万 950.4万
25 600616 金枫酒业 6.14 3.37% 0.20 0.00% 5.95 5.94 6.21 5.81 60674 3655万 1.18% 3.80 -5.79% 6.73% 87.6 31.55亿 31.55亿 0.07 2694万 5.81亿
26 000869 张裕A 30.18 3.18% 0.93 0.10% 29.28 29.25 30.25 29.26 25527 7642万 0.56% 4.26 -68.76% 3.38% 21.0 136.9亿 207.0亿 1.44 7.70亿 38.61亿
27 000752 西藏发展 7.79 3.04% 0.23 -0.40% 7.67 7.56 7.83 7.54 44459 3438万 1.67% 2.01 -16.35% 3.84% -2888.9 20.57亿 20.57亿 -0.00 -54.36万 2.61亿
28 600779 水井坊 43.44 2.99% 1.26 -0.12% 42.30 42.18 44.15 41.89 74683 3.23亿 1.52% 5.69 3.15% 5.36% 38.2 211.8亿 211.8亿 1.14 4.63亿 21.39亿
29 000729 燕京啤酒 6.50 2.85% 0.18 0.47% 6.32 6.32 6.50 6.31 14.29万 9171万 0.55% 3.16 -27.34% 2.69% 113.7 162.6亿 182.6亿 0.06 6.11亿 102.3亿
30 603156 养元饮品 50.37 2.82% 1.38 0.39% 49.00 48.99 50.69 48.43 19029 9486万 0.41% 2.34 -39.61% 4.61% 13.1 229.9亿 379.2亿 3.84 17.41亿 57.57亿
31 600365 通葡股份 4.69 2.40% 0.11 -0.22% 4.58 4.58 4.72 4.58 64760 3022万 1.62% 2.11 -12.34% 3.06% 260.6 18.76亿 18.76亿 0.02 206.5万 6.68亿
32 600543 莫高股份 7.08 2.31% 0.16 0.14% 6.98 6.92 7.14 6.86 48127 3380万 1.47% 1.90 -38.43% 4.05% 118.0 22.74亿 22.74亿 0.06 2046万 1.39亿
33 603779 威龙股份 14.72 2.22% 0.32 0.00% 14.36 14.40 14.88 14.16 8443 1229万 0.81% 1.56 -19.41% 5.00% 50.7 15.17亿 33.76亿 0.29 3472万 5.54亿
34 600962 国投中鲁 9.91 2.16% 0.21 0.10% 9.80 9.70 9.97 9.71 27928 2761万 1.09% 1.83 -10.94% 2.68% 177.6 25.17亿 25.99亿 0.06 657.4万 5.90亿
35 600084 中葡股份 3.47 2.06% 0.07 -0.59% 3.40 3.40 3.55 3.30 14.16万 4862万 1.26% 1.44 -28.41% 7.35% -38.8 39.11亿 39.11亿 -0.09 -8387万 2.84亿
36 601579 会稽山 9.92 1.95% 0.19 0.00% 9.77 9.73 10.03 9.70 22768 2248万 0.56% 2.53 7.02% 3.39% 26.5 39.64亿 49.29亿 0.37 1.02亿 7.80亿
37 600519 贵州茅台 791.86 1.87% 14.56 -0.22% 778.80 777.30 795.00 777.00 22723 17.92亿 0.18% 1.97 -49.84% 2.32% 31.3 9948亿 9948亿 25.34 247.3亿 522.4亿
38 000929 兰州黄河 7.82 1.56% 0.12 0.00% 7.70 7.70 7.87 7.65 9615 745.8万 0.50% 1.15 -13.31% 2.86% -21.5 14.55亿 14.55亿 -0.36 -6755万 5.09亿
39 200869 张裕B 16.91 1.32% 0.22 0.00% 16.69 16.69 17.04 16.59 977 165.2万 0.02% 1.85 -8.02% 2.70% 11.7 76.68亿 115.9亿 1.44 7.70亿 38.61亿
40 600573 惠泉啤酒 8.34 0.97% 0.08 0.36% 8.29 8.26 8.38 8.15 15798 1303万 0.62% 1.51 16.27% 2.78% 50.5 20.95亿 20.95亿 0.17 2459万 4.96亿
41 600189 吉林森工 4.76 0.63% 0.03 -0.21% 4.76 4.73 4.79 4.71 14280 678.8万 0.30% 1.05 -1.09% 1.69% 12.6 22.09亿 34.19亿 0.38 3542万 10.46亿
42 000848 承德露露 9.17 0.44% 0.04 -0.33% 9.04 9.13 9.27 8.88 62919 5707万 0.64% 2.25 25.46% 4.27% 21.8 89.73亿 89.73亿 0.42 4.13亿 21.22亿
43 002568 百润股份 13.40 0.30% 0.04 0.52% 13.29 13.36 13.48 13.07 8835 1173万 0.17% 0.99 9.38% 3.07% 51.5 68.85亿 69.65亿 0.26 1.30亿 8.53亿
44 600238 *ST椰岛 9.85 -1.00% -0.10 0.20% 9.85 9.95 10.03 9.71 15848 1561万 0.35% 1.47 80.97% 3.22% -16.1 43.61亿 43.92亿 -0.61 -1.63亿 3.48亿
开发程序对stock_data.txt进行以下操作:
- 程序启动后,给用户提供查询接口,允许用户重复查股票行情信息(用到循环)
- 允许用户通过模糊查询股票名,比如输入“啤酒”,就把所有股票名称中包含“啤酒”的信息打印出来
- 允许按股票价格、涨跌幅、换手率这几列来筛选信息,比如输入“价格>50”则把价格大于50的股票都打印,输入“市盈率<50“,则把市盈率小于50的股票都打印,不用判断等于。
思路提示:加载文件内容到内存,转成 dict 或 list 结构,然后对 dict 或 list 进行查询等操作。 这样以后就不用每查一次就要打开一次文件了,效率会更高。
二、程序启动后执行效果参考
源码与解析
一、思路
模糊查询:
- 为了方便不用每次都从硬盘读取方便查询,需要把原数据加载到内存里,需要选择存储为 dict 或 list 结构
- 如果使用 list 来存储的话就使用 for 循环一行行的提取,然后搜索包含需要搜索字符的项,但这种结构不利于日后的表格增项
- 如果使用 dict 来存储的话就可以把名称作为 key 然后其他数据作为 value,模糊查询只需要查询 key 值就好了,而日后如果需要在表格中增项只需要替换 value 中的内容即可
- 经过上面的分析,明显的在这个要求下 dict 明显更加合适,所以我们选择用 dict 这种数据结构来存储数据
允许按股票价格、涨跌幅、换手率这几列来筛选信息,并且进行大于小于的判断:
- 接受用户指令,根据查询条件(股票价格、涨跌幅、换手率)去循环 dict,例如条件为“换手率>20”,每循环一次找到对应的值,然后跟用户输入的条件进行大于小于的判断
- 写出判断逻辑的伪代码
user_input = 换手率>10
q_name,q_val = user_input.split(">")
for k in stock_data:
val = stock_data[k]
if val[10] > q_val:匹配上了 # 假设换手率的下标是10
print(val)
二、答案
# 1.打开文件,加载内容,把内容转换成dict
# 2.while,
f = open('stock_data', 'r', encoding='utf-8')
stock_data = {
# 'N德恩':['1','300780','N德恩'...]
# '德国大众':['2','300781','德国大众'...]
}
query_columns = ["最新价", "涨跌幅", "换手率"]
# 先把第一行存读出来,存下来,变成列表
columns = f.readline().strip().split()
for line in f:
line = line.strip().split()
stock_data[line[2]] = line
while True:
match_count = 0
cmd = input("输入查询指令>:").strip()
if len(cmd) == 0: # 排除空值,因为 '' in 'Jove' ——> True
continue
print(columns)
for s_name in stock_data:
if cmd in s_name: # 模糊匹配
print(stock_data[s_name])
match_count += 1
# 输入,最新价、涨跌、换手率 ; 换手率>20
# 要确保用户输入的要查的列是可允许。
# 只支持 > and <
if ">" in cmd:
q_name, q_val = cmd.split(">") # 换手率>20 拆分后q_name='换手率' q_val='20'
q_name = q_name.strip()
q_val = float(q_val)
if q_name in query_columns: # 代表 这是支持的可进行查询的列
q_name_index = columns.index(q_name) # 取到这一列的下标
for s_name, s_vals in stock_data.items():
# 不知道 用户输入的是["最新价","涨跌幅","换手率"]里面的那个值
# 解决方案:拿q_name去到文件 第一行的列名里,去找对应的列的下标。拿到这个下标后,再循环去到每行去取对应的值
if float(s_vals[q_name_index].strip("%")) > q_val: # 用户输入和数据进行对比
print(s_vals) # 打印符合条件的
match_count += 1
elif "<" in cmd:
q_name, q_val = cmd.split("<") # 换手率<20 拆分后q_name='换手率' q_val='20'
q_name = q_name.strip()
q_val = float(q_val)
if q_name in query_columns: # 代表 这是支持的可进行查询的列
q_name_index = columns.index(q_name) # 取到这一列的下标
for s_name, s_vals in stock_data.items():
# 不知道 用户输入的是["最新价","涨跌幅","换手率"]里面的那个值
# 解决方案:拿q_name去到文件 第一行的列名里,去找对应的列的下标。拿到这个下标后,再循环去到每行去取对应的值
if float(s_vals[q_name_index].strip("%")) < q_val: # 用户输入和数据进行对比
print(s_vals) # 打印符合条件的
match_count += 1
if match_count > 0:
print("匹配到%s条" % match_count)
else:
print("无效指令...")
代码输出如下: