import csv
# 输入个人信息的函数
def input_alumni():#固定格式,def 函数名()这里的函数名可以自行订制
name = input('请输入同学的姓名:')#常用方法,用input函数做一个收集信息的作用
live = input('请输入同学所在城市:')#常用方法,用input函数做一个收集信息的作用
telephone = input('请输入同学联系方式:')#常用方法,用input函数做一个收集信息的作用
# 以元组的形式返回
return name, live, telephone#return的返回值,可以让一个函数返回多个值,并且以元组的方式返回
# 写入同学录
def csv_writer(result):#固定格式,def 函数名()这里的函数名可以自行订制
with open('风变同学录.csv', 'a', encoding='gbk', newline='') as f:
#我们要写入文件的时候,第一步要打开文件,同时open函数的参数要设置好,a是追加写入,gbk是csv文件默认的编码格式,newline=''第八关有讲解
writer = csv.DictWriter(f, fieldnames=['同学名称', '所在地', '联系方式'])
#csv的DictWriter类的实例化,作用是对csv文件一个说明写入对象,f是文件,fieldnames是字典的键,这样才能对应csv储存的数据
writer.writerow({'同学名称': result[0], '所在地': result[1], '联系方式': result[2]})
#writerow方法,把参数里面的字典值,写入对应的表头
# 读取同学录
def csv_reader():#固定格式,def 函数名()这里的函数名可以自行订制
f = open('风变同学录.csv', 'r', encoding='gbk')#open函数读取的时候,需要先打开文件,才能够读取文件的信息,这行代码作用是打开文件
reader = csv.DictReader(f)#打开文件后,利用csv文件读取方法,把同学录里面的信息,读取到了reader里面,同时,reader是迭代器对象,只能通过循环遍历取值
return reader
# 定义查询功能的函数
def find():#固定格式,def 函数名()这里的函数名可以自行订制
find_name = input('你要找哪位同学的信息呢:')#常用方法,用input函数做一个收集信息的作用
print('-'*40 + '\n正在查找···\n')
#print()函数,为了分开前面的信息,让终端的显示的结果清晰
for row in csv_reader():#这里的csv_reader(),调用函数,返回值的值是reader,实际上是for row in reader,这样,row就能读取csv每行的数据,他遍历的是csv文件的每一行数据,同时row是以字典的形式来呈现csv的数据内容,键是csv的表头,值是csv对应表头的数据内容
if find_name == row['同学名称']:
#这个find_name是我们想找的同学名称
print('同学名称:{} 所在地:{} 联系方式:{}'.format(row['同学名称'], row['所在地'], row['联系方式']))#显示对应的同学信息
else:
print('查无此人')
print('-' * 40)
# 定义展示同学录信息的函数
def show_info():#固定格式,def 函数名()这里的函数名可以自行订制
print('现在有{}位同学在同学录中'.format(len(list(csv_reader()))))
#这里是先运行csv_reader(),得到reader迭代器对象,然后list函数把迭代器对象转化为一个列表,列表里面的数据是多个字典,这些字典就是csv每行的数据,有多少个字典,就说明有多少个同学
print('-' * 40 + '风变同学录' + '-' * 40)
for row in csv_reader():
#这里的csv_reader(),调用函数,返回值的值是reader,实际上是for row in reader,这样,row就能读取csv每行的数据,他遍历的是csv文件的每一行数据,同时row是以字典的形式来呈现csv的数据内容,键是csv的表头,值是csv对应表头的数据内容
print('同学名称:{} 所在地:{} 联系方式:{}'.format(row['同学名称'], row['所在地'], row['联系方式']))
# 进入主程序,欢迎界面,循环询问是否录入同学录
def main():
# 创建同学录文件并写入表头
with open('风变同学录.csv', 'w', encoding='gbk', newline='') as f:#打开文件,如果文件没有,就会创建一个,这是open函数里面的w模式
writer = csv.DictWriter(f, fieldnames=['同学名称', '所在地', '联系方式'])#csv的DictWriter类的实例化,作用是对csv文件一个说明写入对象,f是文件,fieldnames是字典的键,这样才能对应csv储存的数据
# 写入列标题,即DictWriter构造方法的fieldnames参数
writer.writeheader()#这个地方把实例化的时候fieldnames=['同学名称', '所在地', '联系方式']传入的字典键,写成了表头
print('欢迎进入同学录小程序')
answer = input('现在可以开始录入同学录么?(回答y开始录入,回答t显示目前同学录,回答f寻找个人信息,输入q退出程序):')#用input函数,来做一个对程序的使用
while True:
if answer == 'y':#当answer是y时候,调用input_alumni()函数,开始录入
result = input_alumni()
csv_writer(result)#这是csv的写入方法,调用csv_writer()方法
elif answer == 't':#当answer是t时候,调用show_info()函数,展现数据
show_info()#调用show_info()函数,展现数据
elif answer == 'f':#当answer是f时候,调用find()函数,找寻同学信息
find()#调用find()函数,找寻同学信息
elif answer == 'q':#当answer是q时候,退出循环
break
answer = input('还录入同学录么?(回答y继续录入,回答t显示目前同学录,回答f寻找个人信息,回答q退出录入):')#再次询问是否有其余操作,然后循环到开头,再次进行代码的运行
print('\n录入结束\n')
# 调用函数
main()#这是函数运行的第一步,按照main()函数来运行