002
Q1
- 不论是
.csv
还是.txt
遇到代码都需要先打开文件,一般读取模式是'r'
,并且最好要有文件关闭的函数,否则会差之毫厘,失之千里
。(一分都没有)
fi = open('PY301-vacations.csv','r')
.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
,表示第一行的内容。
- 将文件按行遍历,并以换行符为标志分割,再按照逗号分割为列表。最后
“添加”
到列表ls
中。
for line in fi:
ls.append(line.strip("\n").split(','))
fi.close()
对比:
- 未处理部分的信息:
序号,节日,开始月日,结束月日
# 这里是打印了上一行的换行符,以此类推
1,元旦,1230,0101
2,春节,0215,0221
- 处理后的每行信息:(这样就可以按照列表的切片来访问元素)
['7', '国庆节', '1001', '1007']
- 遍历列表的元素,如果键入的信息是节日的名称,则返回该节日信息的假期范围。这里的方法论是使用
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
- 同理,我们可以借鉴第一题的过程,进一步完善功能的实现。(这里的提示语句略有不同,需要注意,不能疏忽)。
- 注意审题,重新回到输入序号的状态,显然是需要一个循环,并且是
while循环
。 - 外层循环时遍历键入的内容,内容遍历是对内容与分割好的列表元素的比对和匹配。和上一小问不同的是,上一小问是要求键入的节日名称来返回用户的刚需,而这一问是要求键入节日的序号来返回用户的刚需。
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循环
,有点像楼梯,可读性比较弱
- 注意的是,既然是重新回到输入序号的状态,因此当while循环结束后,仍然需要将用户输入语句再次输入一遍,实现重新输入的目的。(这里的第一个for循环和最后一个用户输入的语句是同一个缩进,因此是仍然是在while的语句块内)
- 还有一点需要注意的是,这一小问中用户输入语句(或者说是提示语句)后面采用了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
- 这一问的代码和上一问类似,但是又别于上一问。原因在于,这里使用了类似函数中的关键字参数,这里用在了分支结构中。
- 首先将标志符
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
- 从而达到了如下表格的功能:
输对 | 输错 |
---|---|
程序正常执行 | 您输入有误,请重试 |
总代码:
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(" ")
小结
- 本题主要考察了对
.csv
文件的提取信息,以及python
语法的熟练掌握。 - 所涉及的语法:
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 文件的处理 | |
变量 | 标识符的使用 |