Python入门 Day3-模拟sql语句操作

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  和  存储所有符合条件的列的列表 correct
select 代码完成版

因为在判断符号的时候,我们使用了许多的重复代码。这里我们可以想办法优化一下它

猜你喜欢

转载自www.cnblogs.com/wangph/p/9029625.html