电子英汉词典课程设计-python代码

一、问题描述:

该设计实现简单电子英汉词典的功能,具体管理操作包括单词的添加、显示、查找、删除、修改和保存等。

二、功能描述:

本设计采用结构体数组或链表,每个数据的结构应当包括:单词的英文拼写,单词的中文释义(可以只是最常用的意思),单词的词性。

系统功能:

词条录入:即添加单词记录。
信息显示:将所有的单词按字母顺序显示。
词条修改:对已经输入的单词信息进行修改。
词条删除:删除某个单词记录。
单词查询: 输入单词英文拼写,输出该单词的中文释义。
信息保存:将单词信息保存到文件,文件采用CSV格式保存。
退出系统

系统使用说明:

执行一个具体的功能之后,程序将重新显示功能菜单。系统的功能并不限于上述,可以对其进行扩充完善,如在对信息进行修改和删除时,可以考虑系统的安全性,在执行前若输入正确密码,才可进行操作。

测试数据:

要求单词数>=20,内容要合理。

三、总体设计

通过理解设计题目,很容易发现,题目要求我们使用csv文件来保存已经写好的字典,同时鉴于这个中英文对应存储的目标,我们很容易想到最好使用Python中的字典数据容器来保存我们整个程序的数据,同时,鉴于题目要求的csv格式,我们可以很快发现可以调用csv模块中写入字典的方式来快速实现数据的存储。程序主要分为几个独立的模块,主要分为中英文判断,写入词组,展示字典,修改词组,删除词组,查找对应的英文六个模块,通过主程序统一调用,跳转对应的模块实现功能。
程序流程图

四、详细设计

判断中英文模块:

首先我们发现,在用户使用字典时,有可能会出现输入的不是中文,或者英文的情况,为了防止非法的输入,我们定义了cn-or-en函数,通过这个函数,我们会将用户输入的字符串进行循环判断,判断用户输入的每个字符是否符合我们题目设计的要求,中文循环的部分是直接使用Python里面的字符编号转译成对应文字判断,通过字符串比大小的方式来判断是否在中文范围内,即使如此,中文判断部分依然还有部分的小问题,因为中文字库太过庞大,经历过几次扩充,因此判断时只能将日文字符等也算入中文判断范畴,不过无伤大雅。英文判断的部分,我们使用ord内置函数,将用户输入字符串的每个字符转换为对应ASCII码的值,判断输入的字符是否属于97(a)到122(z)或者65(A)到90(Z)范围,通过这个判断,就可以判断用户输入的整个字符串是否是中文或者英文。该函数的输入变量为cn和en字符串,通过上述处理之后返回值为flag-cn和flag-en的标志值组成的元组。如果输入字符cn串全为中文flag-cn就为1,输入字符串en全为英文,flag-en就为1,否则就为默认值0

字典写入模块:

通过实践和设计要求我们可以明确,这个题目在设计时需要使用csv文件保存,因此,我们想通过定义dict_input函数使用csv中的内置方法和文件操作的open方法将用户创建好的词组对写入csv文件中。在这部分函数中,我们先使用了一个大的循环来使用户在输入出错时能被跳转回当前函数,而不是直接跳出整个循环回到主菜单。然后我们通过定义dict_file变量,使用open方法将文件dicts.csv传入变量,并且给如下参数:mode为a,表示当前为追加模式,防止用户写入字典时覆盖csv文件中原有的数据。通过定义utf-8-sig参数来保证所有的中文都能正常显示,newline参数设置为空,保障写入行的时候不间隔行。然后定义好csvwriter,这是一个对象,对象的目的是将字典写入指定的文件,然后fielenames是分类方法,将字典中对应中文,英文的键的值写入表格。
随后 定义两个标志,一个是返回中英文的标志,一个是判断对应的键值对是否已经存在于文件中。然后要求用户输入中文和英文,设置退出条件,如果两次输入都是#号则退出循环,跳转回主程序。如果用户输入了内容,则将内容放入上面的中英文判断模块,判断是否为中文英文,然后将返回值存在我们刚刚定义的flag元组中。随后我们判断flag中的第一个或第二个元素,如果为0就输出中文或英文输入有误,随后结束当次循环,要求用户重新输入。如果输入正确,元组内应该为两个1,此时我们进入写入的步骤。
写入时,我们重新打开文件为a+模式,因为我们要读取整个文件来查找是否会出现键值对已经存在的情况,通过定义reader,来将csv文件按列存在列表data中,列表中的每一个小列表就是csv文件的一行。通过row循环data中的元素,可以把每一行都拿出来判断,此时如果检测到是第一行,我们就跳过这一次循环元素,然后继续循环判断是否会出现小列表中第一个元素和第二个元素分别都等于cn en变量的情况,这就说明cn和en这一对键值对已经在原来的字典文件中存在了,此时我们就更改之前定义的字典已经存在标志为1,说明当前想要写入的这组词组在原来的字典文件中已经存在了。随后就是写入部分,如果判断是否存在标志为1,则直接跳过这次循环,提示用户重新输入。否则的话我们就通过刚刚定义好的字典写入方法,将已经更改正确的字典写入csv文件中,提示已保存,随后关闭打开的文件,退出整个写入文件的大循环。跳转回主菜单。

字典显示模块:

通过定义一个字典显示模块,可以展示我们原有文件里面已经存在了的词组,首先输出一长串横条作为分割,然后使用withopen方式打开文件,模式选择只读,防止意外的更改,编码格式跟刚刚一样定义为utf-8-sig保障中文,符号的正常读取。通过定义reader方法读取文件,将文件转化为列表存在data列表中,随后使用循环读取data中的每一行,也就是csv文件中的每一行,判断是否为表头,表头是data列表里面row的第0个元素,通过index方法判断出第一行之后,通过输出格式控制输出表行标:“语言”,输出对应的两个元素"中文"和"英文",随后我们输出后续的行,输出行标:“词组”,输出对应的中文和英文,输出时空行设置为空,输出完每一列都打印一个空行,整个输出完之后打印分隔符作为分割,随后关闭整个文件。退出当前模块部分,跳回主菜单。

词组更改模块:

通过定义字典更改模块,我们可以对原字典中已经存在的词组进行更改,该模块的允许按任何语言查找,无论是中文还是英文。首先,定义一个标志来表示字典是否被改变。随后我们开启一个大的循环包裹整个模块,防止用户在输入错误时直接跳回主菜单,而不是重新输入。输入change_char作为我们要查找的内容,提示用户在这里输入#号返回主菜单,随后判断是否为#,如果为#,结束当前循环,跳转回主菜单。随后输入要修改成的中文和英文。将flag作为接受判断中文英文模块的返回值,传入参数为刚刚输入的要修改成的中文和英文。此时flag为元组,第一个元素是中文是否正确,第二个参数是英文是否正确。通过一个判断,如果为0的话说明对应的中文或者英文的输入不正确,此时返回中文或者英文有误,提示用户重新输入,跳过此次循环,重新输入两个值。将flag_change作为接受判断中文英文模块的返回值,传入参数都为要修改的内容,通过返回值我们可以很快知道用户输入的到底是英文还是中文。
满足上述条件之后,我们进入查找和修改的步骤:首先我们打开原有的字典文件,以只读方式打开防止查找时意外的修改,定义编码格式,将所有的内容按行存入data列表中,循环查找每一行,如果是第0个元素,表示第1行,此时我们跳过对这一行的查找,随后我们开始正式的查找阶段。
首先我们判断刚刚得到的中英文元组,判断是中文还是英文,如果是中文(英文),我们就对每一个列表的第0(1)个元素做判断,这是中文(英文)所在位置,如果发现满足当前条件,就修改这一行的元素对应为中文,英文,改变是否修改标志为1表示字典已修改。同时输出对应的用户提示,告知用户字典已修改。
随后我们来修改字典文件,首先我们来判断字典是否已经修改,通过读取修改标志,如果修改标志仍然为默认值0,则说明没找到对应中文或英文的单词,字典没被修改,则跳过当前循环,让用户重新输入。如果修改标志被更改为1,则说明字典已经被修改,此时我们就需要使用with open方式打开文件,注意,此时我们选择的模式为w,因为我们现在对字典是进行覆盖,而不是追加,同样定义编码格式,没有空行,首先定义csv写入的对象,然后使用writerows方式将整个data列表按行写入dict文件,此时整个字典文件都被更新,随后关闭文件,退出整个循环,程序跳转回主菜单。

词组删除模块:

通过定义字典删除模块,可以通过中文或英文,删除对应的词组,并且写入对应文件中。首先开启一个循环来使用户在输入错误时可以重新输入,而不是直接跳转回主菜单。然后我们在循环中定义一个是否修改的标志,默认值为0,这个标志必须定义在循环里面,否则这个标志在下一次循环时不会被归零,在输入错误后的下一次循环无论如何字典都会被修改,这是不满足我们的预期的。然后我们要求用户输入要删除的字符,同时可以输入#返回主菜单。随后我们将要修改的字符作为传入参数,输入给判断中英文函数,得到的返回值给flag元组。然后我们使用with open方法打开我们的字典文件,模式为只读,编码格式指定为一样,通过定义csvreader来读取csv文件,存在data列表中。然后循环这个csv文件的每一行,跳过第一行,然后判断是中文还是英文,如果是中文(英文),按照第0(1)个元素查找是否等于要删除的字符,如果找到对应字符,则使用remove方法删除当前的行,此操作就可以删除整个词组,随后改变是否改变标志为1,表示字典有改变。
随后便是字典修改部分,判断修改标签被改为1后,我们使用withopen方式用w模式打开字典文件,编码格式指定,然后定义writer对象,讲data列表按行写入字典文件中,关闭字典,输出已删除提示,退出循环,跳转回主菜单。如果修改表情不为1,则说明字典没被修改,说明字典中没找到对应的要删除的字符,此时我们输出没有找到提示,并跳过当前循环,要求用户重新输入。

词组查找模块:

通过当前查找模块,我们可以找到输入的中文对应的英文。该模块与其他模块一样,在开始时定义了一个循环,防止用户直接被跳转回主菜单,同时我们定义了查找标志,默认值为0。随后我们要求用户输入一个中文(因为题目要求是中英词典),在用户输入为#时退出循环,返回主菜单。随后我们定义了是否为中英文标志,将用户输入的中文拿到中英文判断函数中进行判断,将返回值存在标志中,然后判断第一位是不是1,如果为是的话就说明用户准确的输入了中文,否则就不是中文,此时跳过当前循环,要求用户重新输入。随后我们用with open方式打开字典文件,模式为只读,定义编码格式,定义reader对象,通过reader对象将文件中的内容按行存储在data列表中,然后对data列表做循环处理,跳过第一行,然后通过每一行的第一个元素进行查找,如果有一样的元素,就将当前行的第二个元素(英文),赋值给find标志,此时就表示我们已经找到了对应的英文解释。退出对data的循环。然后判断查找标志状态,如果标志为0,这说明我们并没有找到对应的解释,此时跳过当前循环,要求用户重新输入。如果标志不为0,则说明我们已经找到对应元素并且更改了标签,此时我们将用户输入的中文和find一起输出表示词组,随后退出循环,返回主菜单。

主程序(菜单和身份验证):

首先定义主程序起点,通过Python自带的__name__标志可以判断当前程序是作为主程序运行还是作为模块被导入,如果作为主程序运行我们就继续执行如下步骤:首先按照追加模式打开字典文件,这里的默认打开是为了防止用户在写入csv文件的表头时文件是关闭的而导致错误。然后我们使用with open函数以只读方式打开字典文件,定义编码格式。定义读取对象reader,定义写入对象writer为字典写入方式,分类方法为中文 英文,指向的对象为刚刚打开的追加格式文件。判断这个字典是否为空,如果为空,就将我们的分类方式,中文 英文写入csv文件中,这样做是为了防止我们每一次运行程序时都默认写入表头,导致字典中的表头重复。
随后定义两个book,第一个book是以字典的形式,存储用户名和密码作为键值对。第二个book是以列表的形式,存储管理员用户作为元素。
随后我们进入正式的身份验证和跳转阶段:首先开启一个循环,防止用户在输入错误用户名或者密码时直接退出程序。同时允许用户在输入用户名时输入q退出系统,此时循环结束,程序结束。随后我们判断这个输入的用户名是否存在于密码本中键的里面,如果不存在就输出提示用户不存在,跳过当前循环,要求用户重新输入。如果存在就继续判断密码是否正确。通过当前的键(用户名)在密码本中找到对应的值(密码),判断和用户输入的密码是否一致,如果不一致则输出密码错误,跳过当前循环要求用户重新输入。如果一致则继续判断管理员权限,判断当前的用户名是否存在于管理员本中,通过in函数来判断是否存在于列表中,如果存在则进入管理员菜单,不存在则进入普通用户菜单。
管理员菜单:首先开启循环,防止管理员在选择出错或者跳转回主菜单时直接跳转回登录界面重新登录。随后显示管理员权限提示,告知当前是管理员权限,并且展示管理员菜单,管理员具有完全的控制权限,可以使用录入 显示 修改 删除 查找等所有功能,用户需要按提示输入对应的数字来进行跳转,尝试用户输入的是否能转换为数字,如果不能则说明输入有误,跳过当前循环并要求用户重新输入。然后先判断输入为6的情况,当前情况用户选择退出登录,则程序退出本层循环,退回输入用户名和密码的循环中,要求用户重新输入账户密码。如果输入为1则跳转到写入模块,为2则跳转到展示模块,为3则跳转到修改模块,为4则跳转到删除模块,为5则跳转到查找模块。如果都不满足,则提示输入错误,跳过当前循环,要求重新输入。
访客菜单:首先开启循环防止选择出错后跳回密码输入界面。提示只有访客权限,允许使用显示 查询 退出登录三个功能,尝试将用户输入转为数字,如果报错则说明输入的不是数字,跳过当前循环要求用户重新输入。判断输入是否为3,如果为3则退出当前循环,退出登录,跳转回输入用户名和密码的界面。如果输入为1则跳转至显示模块,如果输入为2则跳转至查找模块。如果都不是,则提示输入错误,跳过当前循环,要求用户重新输入。
当菜单部分执行完毕时,表示用户已经结束了当前程序,我们通过close命令关闭文件,防止意外的未关闭。

五、代码详细解释

import csv

导入CSV模块,以便在程序中读取和写入CSV文件。

函数 is_chineseis_english

def is_chinese(text):
    """判断文本是否为中文"""
    return all('\u4e00' <= char <= '\u9fa5' for char in text)

定义 is_chinese 函数,检查文本中的所有字符是否都是中文字符。

def is_english(text):
    """判断文本是否为英文"""
    return all(char.isalpha() and (char.islower() or char.isupper()) for char in text)

定义 is_english 函数,检查文本中的所有字符是否都是英文字母。

函数 add_entry

def add_entry():
    """向词典中添加新的词条"""
    while True:
        cn = input("请输入中文(输入#返回主菜单):")
        en = input("请输入英文(输入#返回主菜单):")

定义 add_entry 函数,在一个无限循环中提示用户输入中文和英文词条。输入 # 返回主菜单。

        if cn == en == '#':
            break

如果用户输入 #,则退出循环。

        if not is_chinese(cn):
            print("中文输入有误,请重新输入")
            continue

检查中文输入是否有效,如果无效,提示错误并继续循环。

        if not is_english(en):
            print("英文输入有误,请重新输入")
            continue

检查英文输入是否有效,如果无效,提示错误并继续循环。

        with open('dicts.csv', 'a+', encoding='utf-8-sig', newline='') as dict_file:
            csv_writer = csv.DictWriter(dict_file, fieldnames=["中文", "英文"])
            dict_file.seek(0)
            data = list(csv.DictReader(dict_file))
            if any(row["中文"] == cn and row["英文"] == en for row in data):
                print('对应词条已存在,请重试!')
                continue

打开 dicts.csv 文件用于追加内容,同时创建一个 csv.DictWriter 对象写入新词条。读取现有数据,检查词条是否已存在,如果存在则提示用户重试并继续循环。

            csv_writer.writerow({"中文": cn, "英文": en})
            print("已保存!")
            break

如果词条不存在,写入新词条并提示保存成功,然后退出循环。

函数 display_entries

def display_entries():
    """显示词典中的所有词条"""
    print("—————————————")

定义 display_entries 函数,用于显示词典中的所有词条,首先打印分隔线。

    with open('dicts.csv', 'r', encoding='utf-8-sig') as dict_file:
        reader = csv.DictReader(dict_file)
        print("语言| 中文 英文")
        for row in reader:
            print("词组| {} {}".format(row["中文"], row["英文"]))

打开 dicts.csv 文件进行读取,创建一个 csv.DictReader 对象读取词条。打印标题行,然后遍历并打印每个词条。

    print("——————————————")

最后打印结束分隔线。

函数 modify_entry

def modify_entry():
    """修改词典中的词条"""
    while True:
        search_term = input("请输入要修改的内容(按什么内容查找)(输入#返回主菜单):")
        if search_term == '#':
            break

定义 modify_entry 函数,在一个无限循环中提示用户输入要修改的词条。如果用户输入 #,则退出循环。

        new_cn = input("请输入新的中文:")
        new_en = input("请输入新的英文:")

提示用户输入新的中文和英文词条。

        if not is_chinese(new_cn):
            print("中文输入有误,请重新输入")
            continue

检查新的中文输入是否有效,如果无效,提示错误并继续循环。

        if not is_english(new_en):
            print("英文输入有误,请重新输入")
            continue

检查新的英文输入是否有效,如果无效,提示错误并继续循环。

        with open('dicts.csv', 'r', encoding='utf-8-sig') as dict_file:
            data = list(csv.DictReader(dict_file))
            entry_found = False
            for row in data:
                if row["中文"] == search_term or row["英文"] == search_term:
                    row["中文"] = new_cn
                    row["英文"] = new_en
                    entry_found = True
                    break

打开 dicts.csv 文件进行读取,将数据读取到列表中。查找并修改匹配 search_term 的词条,如果找到则更新其中文和英文词条,并设置 entry_foundTrue

            if not entry_found:
                print("未找到对应的单词,请检查")
                continue

如果未找到匹配的词条,提示用户并继续循环。

        with open('dicts.csv', 'w', encoding='utf-8-sig', newline='') as dict_file:
            csv_writer = csv.DictWriter(dict_file, fieldnames=["中文", "英文"])
            csv_writer.writeheader()
            csv_writer.writerows(data)
        print("已修改!")
        break

如果找到并修改了词条,打开 dicts.csv 文件进行写入,写入标题行和所有数据行,然后提示修改成功并退出循环。

函数 delete_entry

def delete_entry():
    """删除词典中的词条"""
    while True:
        search_term = input('请输入你要删除的单词(中文或者英文)(输入#返回主菜单):')
        if search_term == '#':
            break

定义 delete_entry 函数,在一个无限循环中提示用户输入要删除的词条。如果用户输入 #,则退出循环。

        with open('dicts.csv', 'r', encoding='utf-8-sig') as dict_file:
            data = list(csv.DictReader(dict_file))
            new_data = [row for row in data if row["中文"] != search_term and row["英文"] != search_term]
            if len(data) == len(new_data):
                print("没有找到对应的单词,请检查!")
                continue

打开 dicts.csv 文件进行读取,将数据读取到列表中。过滤出不匹配 search_term 的词条,如果没有变化则提示用户并继续循环。

        with open('dicts.csv', 'w', encoding='utf-8-sig', newline='') as dict_file:
            csv_writer = csv.DictWriter(dict_file, fieldnames=["中文", "英文"])
            csv_writer.writeheader()
            csv_writer.writerows(new_data)
        print(f"已删除 '{search_term}'!")
        break

如果过滤成功,打开 dicts.csv 文件进行写入,写入标题行和过滤后的数据,然后提示删除成功并退出循环。

函数 find_entry

def find_entry():
    """查找词典中的词条"""
    while True:
        search_term = input('请输入你要查找的单词的中文(输入#返回主菜单):')
        if search_term == '#':
            break

定义 find_entry 函数,在一个无限循环中提示用户输入要查找的中文词条。如果用户输入 #,则退出循环。

        if not is_chinese(search_term):
            print("输入错误,请输入中文!")
            continue

检查输入是否为有效的中文,如果无效,提示错误并继续循环。

        with open('dicts.csv', 'r', encoding='utf-8-sig') as dict_file:
            data = list(csv.DictReader(dict_file))
            translation = next((row["英文"] for row in data if row["中文"] == search_term), None)

打开 dicts.csv 文件进行读取,将数据读取到列表中。查找匹配 search_term 的英文词条,如果找到则保存到 translation 变量。

        if translation:
            print(f"'{search_term}' 对应的英文是 '{translation}'")
            break

如果找到对应的英文词条,打印结果并退出循环。

        else:
            print(f"没有找到 '{search_term}' ,请重新输入!")

如果未找到对应的词条,提示用户并继续循环。

主程序 main

def main():
    """主程序入口"""
    with open('dicts.csv', 'a+', encoding='utf-8-sig', newline='') as dict_file:
        dict_file.seek(0)
        if not dict_file.read(1):
            csv_writer = csv.DictWriter(dict_file, fieldnames=["中文", "英文"])
            csv_writer.writeheader()

定义 main 函数,首先打开 dicts.csv 文件以追加方式写入,并检查文件是否为空。如果文件

为空,写入标题行。

    passwd_book = {'yuan': "123456", 'user': 'user', 'admin': 'admin'}
    admin_users = ['yuan', 'admin']

定义用户密码字典 passwd_book 和管理员用户列表 admin_users

    while True:
        print("——————欢迎使用电子英汉词典——————")
        user_id = input("请输入用户名(输入q退出系统):")
        if user_id == 'q':
            print("程序退出")
            break

在一个无限循环中,显示欢迎信息并提示用户输入用户名。如果用户输入 q,则退出循环。

        passwd = input("请输入密码:")
        if user_id in passwd_book and passwd == passwd_book[user_id]:
            if user_id in admin_users:

提示用户输入密码,如果用户名和密码匹配,并且用户是管理员用户,则显示管理员菜单。

                while True:
                    print(f"欢迎您,{user_id}!您有词典的完全控制权限,请按提示选择")
                    print('1. 词条录入')
                    print('2. 信息显示')
                    print('3. 词条修改')
                    print('4. 词条删除')
                    print('5. 单词查询')
                    print('6. 退出登录')
                    choice = input('请按提示输入数字:')
                    if choice == '6':
                        print("已登出!")
                        break

在一个无限循环中,显示管理员菜单并提示用户输入选择。如果用户选择 6,则退出循环。

                    elif choice == '1':
                        add_entry()
                    elif choice == '2':
                        display_entries()
                    elif choice == '3':
                        modify_entry()
                    elif choice == '4':
                        delete_entry()
                    elif choice == '5':
                        find_entry()
                    else:
                        print("输入错误,请重新输入!")

根据用户的选择,调用相应的函数。如果选择无效,提示用户重新输入。

            else:
                while True:
                    print(f"{user_id}, 您好!您只有显示和查找的权限,请按键选择!")
                    print('1. 信息显示')
                    print('2. 单词查询')
                    print('3. 退出登录')
                    choice = input('请按提示输入数字:')
                    if choice == '3':
                        print("已登出!")
                        break
                    elif choice == '1':
                        display_entries()
                    elif choice == '2':
                        find_entry()
                    else:
                        print("输入错误,请重新输入!")

如果用户不是管理员,则显示普通用户菜单,并提示用户输入选择。如果选择无效,提示用户重新输入。

        else:
            print("用户不存在或密码错误,请重试!")

如果用户名或密码不匹配,提示用户重新输入。

if __name__ == '__main__':
    main()

当脚本作为主程序运行时,调用 main 函数启动程序。

六、完整源代码

import csv
def cn_or_en(cn,en):
    flag_cn = flag_en= 0
    for char_cn in cn:
        if not '\u4e00' <= char_cn <= '\u9fa5':
            flag_cn=0
        else:
            flag_cn=1
    for char_en in en:
        if 97 <= ord(char_en) <= 122 or 65 <= ord(char_en) <= 90:
            flag_en=1
        else:
            flag_en=0
    return flag_cn,flag_en
def dict_input():
    while True:
        dict_file = open('dicts.csv', mode='a', encoding='utf-8-sig', newline='')
        csv_writer = csv.DictWriter(dict_file, fieldnames=["中文", "英文", ])
        flag=()
        flag_if_in_dict = 0
        cn = input("请输入中文(输入#返回主菜单):")
        en = input('请输入英文(输入#返回主菜单):')
        if cn==en=='#':
            break
        flag=cn_or_en(cn,en)
        if flag[0]==0:
            print("中文输入有误,请重新输入")
            continue
        elif flag[1]==0:
            print("英文输入有误,请重新输入")
            continue
        else:
            with open('dicts.csv', 'a+', encoding='utf-8-sig', newline='') as f:
                csv_reader = csv.reader(f)
                data = list(csv_reader)
                for row in data:
                    if data.index(row)==0:
                        continue
                    if row[0]==cn and row[1]==en:
                        flag_if_in_dict=1
                if flag_if_in_dict==1:
                    print('对应词条已存在,请重试!')
                    continue
                else:
                    dict_true={"中文":cn,"英文":en}
                    csv_writer.writerow(dict_true)
                    print("已保存!")
                    dict_file.close()
                    break

def dict_show():
    print("—————————————")
    with open('dicts.csv', 'r',encoding='utf-8-sig') as f:
        reader = csv.reader(f)
        data = list(reader)
        for row in data:
            if data.index(row)==0:
                print("语言|{} {} ".format(row[0], row[1]), end="")
            else:
                print("词组|{} {} ".format(row[0],row[1]),end="")
            print()
    print("——————————————")
    dict_file.close()

def dict_change():
    flag_if_change=0
    while True:
        change_char=input("请输入要修改的内容(按什么内容查找)(输入#返回主菜单):")
        if change_char=='#':
            break
        change_cn=input("请输入要修改的中文:")
        change_en=input("请输入要修改的英文:")
        flag=cn_or_en(change_cn,change_en)
        flag_change=cn_or_en(change_char,change_char)
        if flag[0] == 0:
            print("中文输入有误,请重新输入")
            continue
        elif flag[1] == 0:
            print("英文输入有误,请重新输入")
            continue
        else:
            with open('dicts.csv', 'r', encoding='utf-8-sig', newline='') as f:
                csv_reader = csv.reader(f)
                data = list(csv_reader)
                for row in data:
                    if data.index(row)==0:
                        continue
                    if flag_change[0]==1:
                        if row[0]==change_char:
                            print("已修改'{}'对应词组为 '{}'和'{}'".format(change_char,change_cn,change_en))
                            row[0]=change_cn
                            row[1]=change_en
                            flag_if_change=1
                    elif flag_change[1]==1:
                        if row[1]==change_char:
                            print("已修改'{}'对应词组为 '{}'和'{}'".format(change_char,change_cn,change_en))
                            row[0]=change_cn
                            row[1]=change_en
                            flag_if_change=1
            if flag_if_change==0:
                print("未找到对应的单词,请检查")
                continue
            with open('dicts.csv', 'w', encoding='utf-8-sig', newline='') as file:
                csv_writer = csv.writer(file)
                csv_writer.writerows(data)
                dict_file.close()
                break
def dict_del():
    while True:
        flag_if_change = 0
        char_del = input('请输入你要删除的单词(中文或者英文)(输入#返回主菜单):')
        if char_del=='#':
            break
        flag = cn_or_en(char_del, char_del)
        with open('dicts.csv', 'r', encoding='utf-8-sig', newline='') as f:
            csv_reader = csv.reader(f)
            data = list(csv_reader)
            for row in data:
                if data.index(row) == 0:
                    continue
                if flag[0] == 1:
                    if row[0] == char_del:
                        data.remove(row)
                        flag_if_change = 1
                elif flag[1] == 1:
                    if row[1] == char_del:
                        data.remove(row)
                        flag_if_change = 1
        if flag_if_change == 1:
            with open('dicts.csv', 'w', encoding='utf-8-sig', newline='') as file:
                csv_writer = csv.writer(file)
                csv_writer.writerows(data)
                dict_file.close()
                print("已删除 '{}'!".format(char_del))
                break
        else:
            print("没有找到对应的单词,请检查!")
            continue

def dict_find():
    while True:
        find=0
        char_find = input('请输入你要查找的单词的中文(输入#返回主菜单):')
        if char_find=='#':
            break
        flag = cn_or_en(char_find, char_find)
        if not flag[0]==1:
            print("输入错误,请输入中文!")
            continue
        with open('dicts.csv', 'r', encoding='utf-8-sig', newline='') as f:
            csv_reader = csv.reader(f)
            data = list(csv_reader)
            for row in data:
                if data.index(row) == 0:
                    continue
                if row[0] == char_find:
                    find=row[1]
                    break
        if find==0:
            print("没有找到 '{}' ,请重新输入!".format(char_find))
            continue
        else:
            print("'{}' 对应的英文是 '{}'".format(char_find, find))
            break


if __name__=='__main__':
    dict_file = open('dicts.csv', mode='a', encoding='utf-8-sig', newline='')
    with open('dicts.csv','r',encoding='utf-8-sig',newline="")as f:
        reader = csv.reader(f)
        csv_writer = csv.DictWriter(dict_file, fieldnames=["中文","英文",])
        if not [row for row in reader]:
            csv_writer.writeheader()


    passwd_book={'yuan':"123456",'user':'user','admin':'admin'}
    admin_book=['yuan','admin']

    while True:
        print("——————欢迎使用电子英汉词典——————")
        user_id=input("请输入用户名(输入q退出系统):")
        if user_id=='q':
            print("程序退出")
            break
        passwd=input("请输入密码:")
        if user_id in passwd_book.keys():
            if passwd==passwd_book[user_id]:
                if user_id in admin_book:
                    while True:
                        print("欢迎您,{}!您有词典的完全控制权限,请按提示选择".format((user_id)))
                        print('1.词条录入')
                        print('2.信息显示')
                        print('3.词条修改')
                        print('4.词条删除')
                        print('5.单词查询')
                        print('6.退出登录')
                        num_x = input('请按提示输入数字:')
                        try:
                            num_x = int(num_x)
                        except:
                            print("输入应为整数")
                        if num_x == 6:
                            print("已登出!")
                            break
                        elif num_x == 1:
                            dict_input()
                        elif num_x == 2:
                            dict_show()
                        elif num_x == 3:
                            dict_change()
                        elif num_x == 4:
                            dict_del()
                        elif num_x == 5:
                            dict_find()
                        else:
                            print("输入错误,请重新输入!")
                            continue

                else:
                    while True:
                        print("{},您好!您只有访客权限,请按键选择!".format(user_id))
                        print('1.信息显示')
                        print('2.单词查询')
                        print('3.退出登录')
                        num_x = input('请按提示输入数字:')
                        try:
                            num_x = int(num_x)
                        except:
                            print("输入应为整数")
                        if num_x == 3:
                            print("已登出!")
                            break
                        elif num_x == 1:
                            dict_show()
                        elif num_x == 2:
                            dict_find()
                        else:
                            print("输入错误,请重新输入!")
                            continue

            else:
                print('密码错误,请重新输入!')
        else:
            print("用户不存在!请重试!")

    dict_file.close()

七、后记

在设计这个程序的过程中,遇到了很多困难,例如最开始的csv文件如何操作,如何处理,模块的设计等等。通过不断的查找资料,阅读别人写过的操作方式,学会了csv的按行查找模式,学会了可以直接将列表写入csv的方式,这写步骤虽然用时很长(学习),但是给我带来的收获是非常有用的,在之后的设计中充分使用到了这几个方法,为完成这个程序奠定了基础。这样就告诉我们,如果遇到了自己不会的难题,我们可以借助资料,文档来帮助解决,设计时不要担心写不出,先将大致的模块模板写出来,然后再举一反三,将整个模块部分写出来,这个的难度就会小很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值