函数——文件的读写和统计分词2

002

在这里插入图片描述

Q1
  1. 不论是 .csv 还是 .txt 遇到代码都需要先打开文件,一般读取模式是 'r' ,并且最好要有文件关闭的函数,否则会 差之毫厘,失之千里 。(一分都没有)
fi = open('PY301-vacations.csv','r')
  1. .csv 格式的文件,如果用记事本打开,数据与数据间(左右)默认是以逗号分割,行与行之间是以换行符分割
横向纵向
,'\n'
  • 这里采用了按行遍历 fi ,其实这两个代码的作用是相同的:
for line in fi:
for line in fi.readlines():
方法作用形式
read()读取文件的所有内容'1..\n2...\n...'
readline()仅读取一行的内容'1'
readlines()按行读取,每行作为列表的元素['1','2','3',...]
  • 注释:表格中的数字是每行的内容的缩写,e.g. :1,表示第一行的内容
  1. 将文件按行遍历,并以换行符为标志分割,再按照逗号分割为列表。最后 “添加” 到列表 ls 中。
for line in fi:
    ls.append(line.strip("\n").split(','))
fi.close()

对比:

  • 未处理部分的信息:
序号,节日,开始月日,结束月日
# 这里是打印了上一行的换行符,以此类推
1,元旦,1230,0101

2,春节,0215,0221
  • 处理后的每行信息:(这样就可以按照列表的切片来访问元素)
['7', '国庆节', '1001', '1007']
  1. 遍历列表的元素,如果键入的信息是节日的名称,则返回该节日信息的假期范围。这里的方法论是使用str.format()
    方法来格式输出

总代码:

fi = open('PY301-vacations.csv','r')

ls = []

for line in fi:
    ls.append(line.strip("\n").split(','))
fi.close()
s = input("请输入节假日名称:")
for line in ls:
    if s == line[1]:
    
        print("{}的假期位于{}-{}之间".format(line[1],line[2],line[3]))
Q2

在这里插入图片描述

  1. 同理,我们可以借鉴第一题的过程,进一步完善功能的实现。(这里的提示语句略有不同,需要注意,不能疏忽)。
  2. 注意审题,重新回到输入序号的状态,显然是需要一个循环,并且是 while循环
  3. 外层循环时遍历键入的内容,内容遍历是对内容与分割好的列表元素的比对和匹配。和上一小问不同的是,上一小问是要求键入的节日名称来返回用户的刚需,而这一问是要求键入节日的序号来返回用户的刚需。
while True:
    for i in s:
        for line in ls:
            if i == line[0]:
            	print("{}({})假期是{}月{}日至{}月{}日之间".format(line[1],line[0],line[2][:2],line[2][2:],line[3][:2],line[3][2:]))
  • 这里的思路和老师的一样,都是采用了切片的方式来嵌套访问列表的元素。下面这两个代码可以等效
line[2][:2]
line[2][0] + line[2][1]
# 验证一下!
>>>print(bool((line[2][0] + line[2][1]) == line[2][:2]))
True
  • 但是一般不建议这样写 for循环 ,有点像楼梯,可读性比较弱
  1. 注意的是,既然是重新回到输入序号的状态,因此当while循环结束后,仍然需要将用户输入语句再次输入一遍,实现重新输入的目的。(这里的第一个for循环和最后一个用户输入的语句是同一个缩进,因此是仍然是在while的语句块内
  2. 还有一点需要注意的是,这一小问中用户输入语句(或者说是提示语句)后面采用了split方法进行分割。实现了每个序号间的一行多输
s = input("请输入节假日序号:").split(" ")

总代码:

fi = open('PY301-vacations.csv','r')

ls = []

for line in fi:
    ls.append(line.strip("\n").split(','))
fi.close()
s = input("请输入节假日序号:").split(" ")
while True:
    for i in s:
        for line in ls:
            if i == line[0]:
            
                print("{}({})假期是{}月{}日至{}月{}日之间".format(line[1],line[0],line[2][:2],line[2][2:],line[3][:2],line[3][2:]))
    s = input("请输入节假日序号:").split(" ")

Q3

在这里插入图片描述

  1. 这一问的代码和上一问类似,但是又别于上一问。原因在于,这里使用了类似函数中的关键字参数,这里用在了分支结构中。
  • 首先将标志符 flag 设置为假,当程序正确的输出了用户的刚需,再将标志符 flag 设置为。由于标识符是默认为假,故分支结构不会执行
while True:
    for i in s:
        flag = False
        for line in ls:
            if i == line[0]:
                print("{}({})假期是{}月{}日至{}月{}日之间".format(line[1],line[0],line[2][:2],line[2][2:],line[3][:2],line[3][2:]))
                flag = True
  1. 从而达到了如下表格的功能:
输对输错
程序正常执行您输入有误,请重试

总代码:

fi = open('PY301-vacations.csv','r')

ls = []

for line in fi:
    ls.append(line.strip("\n").split(','))
fi.close()
s = input("请输入节假日序号:").split(" ")
while True:
    for i in s:
        flag = False
        for line in ls:
            if i == line[0]:
            
                print("{}({})假期是{}月{}日至{}月{}日之间".format(line[1],line[0],line[2][:2],line[2][2:],line[3][:2],line[3][2:]))
                
                flag = True
                
        if flag == False:
            print("输入节假日编号有误!")
            
    s = input("请输入节假日序号:").split(" ")
小结
  1. 本题主要考察了对 .csv 文件的提取信息,以及 python 语法的熟练掌握。
  2. 所涉及的语法:str.split() 、while循环、单分支结构、list.append()、str.strip()、列表的切片访问、for循环、列表的嵌套访问、str.format()、文件的读取操作
语法明细
字符串str.split()
str.strip()
str.format()
列表list.append()
切片访问
嵌套访问
分支结构单分支结构
循环结构while循环
for循环
文件的读取操作fi.open()
fi.close()
.csv文件的处理
变量标识符的使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的_小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值