Python入门 Day3-模拟sql语句操作
时间:2022-03-15 08:05
userinfo文件格式:
1,Alex,22,13651054608,IT 2,Egon,23,13304320533,Tearcher 3,nezha,25,1333235322,IT
sql语句格式
select name,age where age>22 select * where job = IT select * where phone like 133
要求写一个程序,可以模拟sql语句对userinfo文件做到增删改查
思路:
1. 处理输入的语句,一行sql语句如下,大概分为两部分,要查询的列和查询条件。我们可以据此将sql语句处理,得到两个变量col(列)和con(条件)
2. 拿到条件col后,调用一个分析函数对条件进行分析。通常的列有以下几种查询格式:‘> < = like’。分别依据条件符号分割条件con,得到col_name,和value。并调用处理函数。
3. 调用处理函数,需要拿到文件内容,先定义读取文件的函数。
4. 将读取文件函数写成一个生成器函数,翻译每一行文件内容格式化的列表
5. 在处理函数中,根据分析函数传入的结果,对文件内容进行分析。将符合条件的列返回
6. 格式化输出。将处理函数返回的符合条件的列,根据列col,进行分析,返回符合条件的内容,并输出。
7. 下面我们按照代码写出的思路一步一步实现这个程序
### 代码第一波
# step1 接收输入的sql语句,并处理语句,得到col和con #exp = input(‘>>>‘).strip() #便于调试,我们把输入的sql语句先固定下来 exp = ‘ select name,age where age>22 ‘ # 处理sql语句 col, con = exp.split(‘where‘) #col = select name,age con age>22 # 去掉查询命令select,只保留列的内容 col = col.replace(‘select‘,‘‘).strip() # col = name,age *** 去掉空格很重要 # print(col,con) # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数 。 condition_analysis(con) # 下一步 在本段代码上方定义这个函数
### 代码第二波
# step2 def condition_analysis(con): ‘‘‘判断条件中的符号,并依据符号切割条件,得到两个值‘‘‘ if ‘>‘ in con: col_name, value = con.split(‘>‘) # 切记切记 一定要去掉空格 col_name = col_name.strip() value = value.strip() ‘‘‘分析条件完成后,调用处理函数处理条件 ‘‘‘ # filter_item(col_name, value, ‘>‘) ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号 correct = filter_item(col_name, value, ‘>‘) #调用处理函数得到的结果赋值给correct,用return返回 return correct # step1 接收输入的sql语句,并处理语句,得到col和con #exp = input(‘>>>‘).strip() #便于调试,我们把输入的sql语句先固定下来 exp = ‘ select name,age where age>22 ‘ # 处理sql语句 col, con = exp.split(‘where‘) #col = select name,age con age>22 # 去掉查询命令select,只保留列的内容 col = col.replace(‘select‘,‘‘).strip() # col = name,age *** 去掉空格很重要 # print(col,con) # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数 condition_analysis(con)
# 下一步 在本段代码上方定义这个函数
### 代码第三波
# step3 def read_file(): with open(‘userinfo‘,‘r‘) as f: for line in f: line = line.strip() ## 一定要处理行首行位的空格 很重要 line_list = line.split(‘,‘) # 得到list格式的行 yield line_list # 用生成器的方式返回每一行的list def filter_item(col_name, value, single): # 接收条件分析函数传入的参数 ‘‘‘在处理条件前,需要先读取文件内容,在上面定义read_file函数‘‘‘ pass # step2 def condition_analysis(con): ‘‘‘判断条件中的符号,并依据符号切割条件,得到两个值‘‘‘ if ‘>‘ in con: col_name, value = con.split(‘>‘) # 切记切记 一定要去掉空格 col_name = col_name.strip() value = value.strip() ‘‘‘分析条件完成后,调用处理函数处理条件 ‘‘‘ # filter_item(col_name, value, ‘>‘) ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号 correct = filter_item(col_name, value, ‘>‘) #调用处理函数得到的结果赋值给correct,用return返回 return correct # step1 接收输入的sql语句,并处理语句,得到col和con #exp = input(‘>>>‘).strip() #便于调试,我们把输入的sql语句先固定下来 exp = ‘ select name,age where age>22 ‘ # 处理sql语句 col, con = exp.split(‘where‘) #col = select name,age con age>22 # 去掉查询命令select,只保留列的内容 col = col.replace(‘select‘,‘‘).strip() # col = name,age *** 去掉空格很重要 # print(col,con) # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数 condition_analysis(con) # 下一步 在本段代码上方定义这个函数
### 代码第四波
# step3 -2 def read_file(): with open(‘userinfo‘, ‘r‘) as f: for line in f: line = line.strip() ## 一定要处理行首行位的空格 很重要 line_list = line.split(‘,‘) # 得到list格式的行 yield line_list # 用生成器的方式返回每一行的list # step4 完善这个函数 # step3 -1 def filter_item(col_name, value, single): # 接收条件分析函数传入的参数 ‘‘‘在处理条件前,需要先读取文件内容,在上面定义read_file函数‘‘‘ dic = {‘id‘: 0, ‘name‘: 1, ‘age‘: 2, ‘phone‘: 3, ‘job‘: 4} correct = [] # 定义一个空列表,存放符合条件的列 if single == ‘>‘ for line_list in read_file(): # 用for循环从上面读文件的迭代器中取值 if int(line_list[dic[col_name]]) > int(value): # 如果如何条件 correct.append(line_list) # 就把这个列追加到correct return correct ## 处理完之后,返回这个列给调用本函数的condition_analysi函数 # step2 def condition_analysis(con): ‘‘‘判断条件中的符号,并依据符号切割条件,得到两个值‘‘‘ if ‘>‘ in con: col_name, value = con.split(‘>‘) # 切记切记 一定要去掉空格 col_name = col_name.strip() value = value.strip() ‘‘‘分析条件完成后,调用处理函数处理条件 ‘‘‘ # filter_item(col_name, value, ‘>‘) ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号 correct = filter_item(col_name, value, ‘>‘) # 调用处理函数得到的结果赋值给correct,用return返回 return correct # step1 接收输入的sql语句,并处理语句,得到col和con # exp = input(‘>>>‘).strip() # 便于调试,我们把输入的sql语句先固定下来 exp = ‘ select name,age where age>22 ‘ # 处理sql语句 col, con = exp.split(‘where‘) # col = select name,age con age>22 # 去掉查询命令select,只保留列的内容 col = col.replace(‘select‘, ‘‘).strip() # col = name,age *** 去掉空格很重要 # print(col,con) # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数 # condition_analysis(con) # 分析函数调用了处理函数,并接受了处理函数返回的值,并将接到的返回值返回给这里 # 下一步 在本段代码上方定义这个函数
### 代码第五波
# step3 -2 def read_file(): with open(‘userinfo‘, ‘r‘) as f: for line in f: line = line.strip() ## 一定要处理行首行位的空格 很重要 line_list = line.split(‘,‘) # 得到list格式的行 yield line_list # 用生成器的方式返回每一行的list # step4 完善这个函数 # step3 -1 def filter_item(col_name, value, single): # 接收条件分析函数传入的参数 ‘‘‘在处理条件前,需要先读取文件内容,在上面定义read_file函数‘‘‘ dic = {‘id‘: 0, ‘name‘: 1, ‘age‘: 2, ‘phone‘: 3, ‘job‘: 4} correct = [] # 定义一个空列表,存放符合条件的列 if single == ‘>‘: for line_list in read_file(): # 用for循环从上面读文件的迭代器中取值 if int(line_list[dic[col_name]]) > int(value): # 如果如何条件 correct.append(line_list) # 就把这个列追加到correct return correct ## 处理完之后,返回这个列给调用本函数的condition_analysi函数 # step2 def condition_analysis(con): ‘‘‘判断条件中的符号,并依据符号切割条件,得到两个值‘‘‘ if ‘>‘ in con: col_name, value = con.split(‘>‘) # 切记切记 一定要去掉空格 col_name = col_name.strip() value = value.strip() ‘‘‘分析条件完成后,调用处理函数处理条件 ‘‘‘ # filter_item(col_name, value, ‘>‘) ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号 correct = filter_item(col_name, value, ‘>‘) # 调用处理函数得到的结果赋值给correct,用return返回 return correct # step5-2 def show(col, correct): dic = {‘id‘: 0, ‘name‘: 1, ‘age‘: 2, ‘phone‘: 3, ‘job‘: 4} if col == ‘*‘: #当查询列是*的时候,要返回所有列的内容 col_list = dic.keys() else: col_list= col.split(‘,‘) ## 根据列生成一个列表,下面会根据这个列表从dic中取到索引值 for line in correct: for col in col_list: print(line[dic[col]],end=‘ ‘) ## 根据索引,输出需要的值 print() # 换行 # step1 接收输入的sql语句,并处理语句,得到col和con # exp = input(‘>>>‘).strip() # 便于调试,我们把输入的sql语句先固定下来 exp = ‘ select name,age where age>22 ‘ # exp = ‘ select * where age>22 ‘ # 处理sql语句 col, con = exp.split(‘where‘) # col = select name,age con age>22 # 去掉查询命令select,只保留列的内容 col = col.replace(‘select‘, ‘‘).strip() # col = name,age *** 去掉空格很重要 # print(col,con) # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数 # condition_analysis(con) # 分析函数调用了处理函数,并接受了处理函数返回的值,并将接到的返回值返回给这里 # 下一步 在本段代码上方定义这个函数 # step5-1 correct = condition_analysis(con) # 需要将上面一行相同的代码注释。这里写两次是为了思路清晰。 # 此时correct接到的值就是所有符合条件的列的完整形式了。接下来需要按照我们的需求,返回列条件col中指定的内容,在上面定义一个show函数完成操作 show(col, correct) # 传入的值是 需要的列条件col 和 存储所有符合条件的列的列表 correct
至此,能查询条件中包含“>”的select代码已经完成,接下来就是 实现 “< = like”的功能了,只要复制替换重复的代码段就可以了
实现多种条件的完成代码
# step3 -2 def read_file(): with open(‘userinfo‘, ‘r‘) as f: for line in f: line = line.strip() ## 一定要处理行首行位的空格 很重要 line_list = line.split(‘,‘) # 得到list格式的行 yield line_list # 用生成器的方式返回每一行的list # step4 完善这个函数 # step3 -1 def filter_item(col_name, value, single): # 接收条件分析函数传入的参数 ‘‘‘在处理条件前,需要先读取文件内容,在上面定义read_file函数‘‘‘ dic = {‘id‘: 0, ‘name‘: 1, ‘age‘: 2, ‘phone‘: 3, ‘job‘: 4} correct = [] # 定义一个空列表,存放符合条件的列 if single == ‘>‘: for line_list in read_file(): # 用for循环从上面读文件的迭代器中取值 if int(line_list[dic[col_name]]) > int(value): # 如果如何条件 correct.append(line_list) # 就把这个列追加到correct elif single == ‘<‘: for line_list in read_file(): if int(line_list[dic[col_name]]) < int(value): correct.append(line_list) elif single == ‘=‘: for line_list in read_file(): if line_list[dic[col_name]] == value: correct.append(line_list) elif single == ‘like‘: for line_list in read_file(): # if int(line_list[dic[col_name]]) > int(value): if value in line_list[dic[col_name]]: ## like的时候 这里需要变更一下代码,与其他不同 correct.append(line_list) return correct ## 处理完之后,返回这个列给调用本函数的condition_analysi函数 # step2 def condition_analysis(con): ‘‘‘判断条件中的符号,并依据符号切割条件,得到两个值‘‘‘ if ‘>‘ in con: col_name, value = con.split(‘>‘) # 切记切记 一定要去掉空格 col_name = col_name.strip() value = value.strip() ‘‘‘分析条件完成后,调用处理函数处理条件 ‘‘‘ # filter_item(col_name, value, ‘>‘) ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号 correct = filter_item(col_name, value, ‘>‘) # 调用处理函数得到的结果赋值给correct,用return返回 elif ‘<‘ in con: ## 实现 < 将上面的代码段复制,替换三个符号即可,= 也是这样 col_name, value = con.split(‘<‘) col_name = col_name.strip() value = value.strip() correct = filter_item(col_name, value, ‘<‘) elif ‘=‘ in con: col_name, value = con.split(‘=‘) col_name = col_name.strip() value = value.strip() correct = filter_item(col_name, value, ‘=‘) elif ‘like‘ in con: col_name, value = con.split(‘like‘) col_name = col_name.strip() value = value.strip() correct = filter_item(col_name, value, ‘like‘) return correct # step5-2 def show(col, correct): dic = {‘id‘: 0, ‘name‘: 1, ‘age‘: 2, ‘phone‘: 3, ‘job‘: 4} if col == ‘*‘: #当查询列是*的时候,要返回所有列的内容 col_list = dic.keys() else: col_list= col.split(‘,‘) ## 根据列生成一个列表,下面会根据这个列表从dic中取到索引值 for line in correct: for col in col_list: print(line[dic[col]],end=‘ ‘) ## 根据索引,输出需要的值 print() # 换行 # step1 接收输入的sql语句,并处理语句,得到col和con # exp = input(‘>>>‘).strip() # 便于调试,我们把输入的sql语句先固定下来 # exp = ‘ select name,age where age>22 ‘ exp = ‘ select * where age = 25 ‘ # 处理sql语句 col, con = exp.split(‘where‘) # col = select name,age con age>22 # 去掉查询命令select,只保留列的内容 col = col.replace(‘select‘, ‘‘).strip() # col = name,age *** 去掉空格很重要 # print(col,con) # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数 # condition_analysis(con) # 分析函数调用了处理函数,并接受了处理函数返回的值,并将接到的返回值返回给这里 # 下一步 在本段代码上方定义这个函数 # step5-1 correct = condition_analysis(con) # 需要将上面一行相同的代码注释。这里写两次是为了思路清晰。 # 此时correct接到的值就是所有符合条件的列的完整形式了。接下来需要按照我们的需求,返回列条件col中指定的内容,在上面定义一个show函数完成操作 show(col, correct) # 传入的值是 需要的列条件col 和 存储所有符合条件的列的列表 correctselect 代码完成版
因为在判断符号的时候,我们使用了许多的重复代码。这里我们可以想办法优化一下它