Python课老师布置了几道实验习题,虽然是一次小实验,不过其中一道题犯过很多错,学习了很多知识点,有必要总结一下。
题目描述:
Python源文件改写。编写一个程序,读取一个Python源程序文件,将文件中所有除保留字外的小写字母换成大写字母,生成后的文件要能够被Python解释器正确执行。
习题源码:
import keyword
s=keyword.kwlist
#建立保留字列表
file_name = "F:\个人\Python\PY\Python实验6/t.txt"
f = open(file_name, "r")
ls=[]
for i in f.readlines():
i=i.split()
ls.append(i)
print(ls)
#建立一个以每行的所有单词为元素组成的一个列表组
f.close()
f = open(file_name, "w+")
for i in range(len(ls)):
if ls[i]:
for j in range(len(ls[i])):
x= ls[i][j]
if x not in s:
x=x.upper()
else:
x=x.lower()
if j == len(ls[i])-1:#判定是否遍历至每行的末尾
f.write(x+"\n")
else:
f.write(x+" ")
else:
f.write(" "+"\n")
f.close()
犯错知识点总结:
1.keyword.kwlist可以得到所有关键字元素,不需要单独列一个关键字的集合
2.文件默认路径是该Python文件所在路径。书写绝对路径的时候推荐字符串前面加r防止字符转义,或者使用'/'或者'\\',因为'\'是转义字符,单独使用的话编译器能无法正确解读,可能会把D:\\py\t.txt解读为'\t'而报错
3.当split()方法不带参数时,默认以空格分界
4.open()方法用于打开一个文件,第一个参数是文件路径和文件名,第二个参数是读写模式。
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
5.文件执行完操作一定要记得close(),平时写代码注意规范和细节才能避免不必要的debug
文件或者类文件对象的close方法的作用主要有两个: 1. 释放资源。打开一个文件,对文件进行操作,这个过程需要消耗计算机的硬件资源,最主要的就是内存(比如接下来要说的"读写缓冲区"),调用close方法后,文件对象占用的资源就会被释放。 2.清空缓冲区。当你打开一个文件向里面写入数据或者从某个url获取远程html想对其进行解析,这时候就会用到缓冲区的概念。比如你要写入文件,你想写入文件的数据并不会直接输出到那个文件中,而是首先被输出到缓冲区,等到缓冲区满或者手动刷新时,才将缓冲区中已有的数据输出到文件中(这样设计的原因是避免了频繁I/O,提高了效率)。因此,close方法的另一个作用就是清空缓冲区中的数据(当然你也可以调用flush这样的方法)
6.判断列表是否为空的方法
由于一个空 list 本身等同于Flase,所以可以直接:
if mylist:
# Do something with my list
else:
# The list is empty
7.open()后得到的是文件,如果想读需要.readlines()
要确定需要进行操作的是文件还是文件里的数据
8.list列表里面的元素也可以是list列表,要注意获得list[i]时得到是list还是str
9.学会了在jupter notebook中如何debug
执行 %xmode Plain
可以设置为当异常发生时只展示简单的异常信息。
执行 %xmode Verbose
来还原显示详细异常信息的模式。
执行%debug
将进入出错语句的调试模式,可以在调试模式自带的对话框中输入变量名来查看函数中的变量情况,输入“quit”则退出该模式。
在调试模式下,我们也可以通过输入“up”来对外层函数进行调试,查看其中的变量情况。
执行 %pdb on 可以设置为当异常发生时自动进入调试模式,在某些特殊的情况下,这么做可能会更为方便。
此次习题收获了很多知识,继续学习!