二十八 二十九 文件
打开文件 open(文件名[,模式][,缓冲]) 注意open是个函数不是方法
模式:
缓冲:
大于1的数字代表缓冲区的大小(单位是字节),-1(或者是任何负数)代表使用默认缓冲区大小
只有用flush或者close时才会更新硬盘的数据
三种标准的流:
输入:sys.stdin 输出:sys.stdout 错误:sys.stderr
用list()让文件成为一个列表,每一行是一个元素
用f.seek(0,0)还原文件指针到起始位置
用for读取文件中的每一行
三十 os模块和os.path模块
Python os模块包含普遍的操作系统功能,注意括号中需要使用字符串
1.getcwd()
返回当前工作目录
2.chdir(path)
改变工作目录
3.listdir(path=‘.‘)
列举指定目录中的文件名(‘.‘表示当前目录,‘..‘表示上一级目录)
4.mkdir(path)
创建单层目录,如该目录已存在抛出异常
5.makedirs(path)
递归创建多层目录,如该目录已存在抛出异常,注意:‘E:\\a\\b‘和‘E:\\a\\c‘并不会冲突
6.remove(path)
删除文件
7.rmdir(path)
删除单层目录,如该目录非空则抛出异常
8.removedirs(path)
递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常
9.rename(old, new)
将文件old重命名为new
10.system(command)
运行系统的shell命令
以下函数没有参数
11.os.curdir
指代当前目录(‘.‘)
12.os.pardir
指代上一级目录(‘..‘)
13.os.sep
输出操作系统特定的路径分隔符(Win下为‘\\‘,Linux下为‘/‘)
14.os.linesep
当前平台使用的行终止符(Win下为‘\r\n‘,Linux下为‘\n‘)
15.os.name
指代当前使用的操作系统(包括:‘posix‘, ‘nt‘, ‘mac‘, ‘os2‘, ‘ce‘, ‘java‘)
os.path模块
1.basename(path)
去掉目录路径,单独返回文件名
2.dirname(path)
去掉文件名,单独返回目录路径
3.join(path1[, path2[, ...]])
将path1, path2各部分组合成一个路径名
4,split(path)
分割文件名与路径,返回(f_path, f_name)元组。如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在
5.splitext(path)
分离文件名与扩展名,返回(f_name, f_extension)元组
6.getsize(file)
返回指定文件的尺寸,单位是字节
7.getatime(file)
返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
8.getctime(file)
返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
9.getmtime(file)
返回指定文件最新的修改时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
以下为函数返回 True 或 False
10.exists(path)
判断指定路径(目录或文件)是否存在
11.isabs(path)
判断指定路径是否为绝对路径
12.isdir(path)
判断指定路径是否存在且是一个目录
13.isfile(path)
判断指定路径是否存在且是一个文件
14.islink(path)
判断指定路径是否存在且是一个符号链接
15.ismount(path)
判断指定路径是否存在且是一个挂载点
16.samefile(path1, paht2)
判断path1和path2两个路径是否指向同一个文件
三十一 pickle模块
以二进制保存数据
三步走:打开文件,用pickle.dump()方法将数据放入文件,关闭文件
1 import pickle 2 my_list = [1,2,‘老王‘,[‘abc‘]] 3 pickle_file = open(‘my_list.pkl‘,‘wb‘) #文件名后缀无所谓 4 pickle.dump(my_list,pickle_file) 5 pickle_file.close()
这样文件夹中就保存了my_list.pkl文件,(查询当前目录是用 import os os.getcwd())
读取数据
打开文件,调用pickle.load()方法
pickle_file = open(‘my_list.pkl‘,‘rb‘) list2 = pickle.load(pickle_file) print(list2)
三十二 三十三 异常
常见异常类型:
AttributeError:属性错误,特性引用和赋值失败时会引发属性错误
NameError:试图访问的变量名不存在
SyntaxError:语法错误,代码形式错误
Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions模块中定义。
IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误
KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误
IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引
TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误
ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误
ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。
捕获异常
try语句一旦被检测出异常,剩下的语句将不会被执行
几种搭配:
1.try except
1 try: 2 sum = 1/0 3 except ZeroDivisionError: 4 print(‘出错‘)
可以指明出错原因:
1 try: 2 sum = 1/0 3 except ZeroDivisionError as reason: 4 print(‘出错,错误原因:‘,str(reason))
可以用多个except语句:
1 try: 2 f = open("nofile.txt") 3 sum = 1/0 4 except IOError as reason: 5 print(‘出错,错误原因:‘,str(reason)) 6 except ZeroDivisionError as reason: 7 print(‘出错,错误原因:‘,str(reason))
可以用一个元组捕获多个异常:
1 try: 2 sum = 1/0 3 f = open("nofile.txt") 4 except (IOError,ZeroDivisionError) as reason: 5 print(‘出错,错误原因:‘,str(reason))
用while True 和 else 组合,else后的语句在没有异常的情况下才执行,注意缩进,输入错误后会重新输入直到正确:
1 while True: 2 try: 3 x = int(input("input first num")) 4 y = int(input("input first num")) 5 z = x/y 6 print(z) 7 except ZeroDivisionError: 8 print("error,try again") 9 else: 10 break
不管try语句中是否发生异常,finally语句后都会执行:
1 try: 2 x = int(input("input first num")) 3 y = int(input("input first num")) 4 z = x/y 5 print(z) 6 except ZeroDivisionError: 7 print("error:") 8 finally: 9 print("结束")
三十四 else和with
else:
if-else语句:
和各种语言相同的用法,在条件语句中,与if语句搭配使用的else语句。如果if语句的条件表达式的结果布尔值为假,那么程序将执行else语句后的代码。
elif(else-if)语句:
elif是python提供的else-if语句,它检查多个条件表达式的值是否为真,并在为真时执行特定代码块中的代码。和else一样,elif是可选的,但是要注意的是,一个if语句可以跟多个elif语句,但最后只能有一个else语句
while-else/for-else语句:
在其他语言中,除了条件语句,是不会见到else分支的,但在Python中,while和for循环中,也是可以使用else语句的。它们的工作顺序为:在循环中使用时,else语句只在循环完成后执行,也就是说,break语句也会跳过else代码块,只要循环是正常结束,而不是通过break,else语句就会执行
求素数:
1 def fun(num): 2 count = int(num/2) 3 while count>1: 4 if(num%count == 0): 5 print("%d的最大公约数是:%d" %(num,count)) 6 break 7 count -= 1 8 else: 9 print("%d是素数" %num) 10 11 n = int(input("请输入一个整数:")) 12 fun(n)
执行结果:
注意:Python中没有自增自减运算符,格式化输出多个字符要用元组的形式
try-else语句:
对于python中的错误和异常,try-except语句段,也可以和else连用,其功能和循环中的else语句没有多大区别:在try范围内没有检测到异常的时候,执行else子句。
with:
这个语法是用来代替传统的try...finally语法的。
with EXPRESSION [ as VARIABLE] WITH-BLOCK
1 try: 2 with open("e://1.txt",‘r‘) as f: 3 for each_line in f: 4 print(each_line) 5 except IOError as reason: 6 print("Error:",str(reason))
如果用finally,若是文件不存在,也要走f.close(),这样的话文件存在打开后会自动关闭
类和对象
类的构造方法 def __init__():
1 class People: 2 def __init__(self,name): 3 self.name = name
注意:在构造方法中的变量不用再次声明,必须有self,创建类的对象是用=
类的私有成员
让方法或者类变为私有,只要在它的名字前加上双下划线
1 class People: 2 __name = ‘laowang‘ 3 def getname(self): 4 return self.__name
注意:类的私有成员可以通过方法访问,也可以通过 _类名__私有成员这种格式来访问
类的继承
class 子类(父类、基类、超类)
在继承构造函数的过程中,可以用以下两个方法,推荐方法2:
(1)调用未绑定的父类构造方法
1 class People: 2 def __init__(self): 3 self.name = ‘aa‘ 4 class Student(People): 5 def __init__(self): 6 People.__init__(self) 7 self.son = 20
(2)使用super
class People: def __init__(self): self.name = ‘aa‘ class Student(People): def __init__(self): super().__init__() self.son = 20
super可以不带任何参数,但是当父类中有参数传入,super后的__init__要加上参数而且不能加上self
1 class People: 2 def __init__(self,name): 3 self.name = name 4 class Student(People): 5 def __init__(self,name,sno): 6 super().__init__(name) 7 self.name = name 8 self.sno = sno
类的组合
类之间没用明显继承关系可以用组合,比如一个电话簿的类由电话和地址类组合起来:
1 class Tel: 2 def __init__(self,x): 3 self.info = x 4 5 class Add: 6 def __init__(self,y): 7 self.info = y 8 9 class Notebook: 10 def __init__(self,x,y): 11 self.tel = Tel(x) 12 self.add = Add(y) 13 def print_info(self): 14 print("Tel:%s\nAdd:%s" %(self.tel.info,self.add.info))
类 类对象 实例对象
类对象就像C++中的static变量,一个对象有了实例对象后就将类对象的值覆盖了
属性名如果和方法名相同,属性会覆盖方法
绑定
对象.__dict__返回对象拥有的属性
对象调用后方法绑定到实例对象上del类后,a的方法还是存在的,因为A的方法和属性都是static,程序退出前不会消失
一些和类相关的BIF
issubclass(class, classinfo)
isinstance(object, classinfo)
hasattr(object, name) 注意第二个参数要用字符串格式
getattr(object, name[, default])
setattr(object, name, value)
delattr(object, name)
魔法方法
魔法方法总是被双下划线包围,它们总能在适当的时候自动被调用
__init__(self) 不能有返回值
__new__(cls[,]) 返回一个类对象,python自动调用,一般不需要重写
__del__(self) del一个对象的时候被调用
模块
(1)import 文件名 比如想导入tmp.py,在主程序中写import tmp,并用tmp.调用函数
(2)import 文件名 form 函数名(若要引用全部,写*) 在主程序中直接调用函数名
(3)import 文件名 as 别名 在主程序中用 别名. 调用函数
if __name__ == "__main__":
简单来说当一个文件作为模块时,在if __name__ == "__main__":语句后的内容不能被调用
原理:
当作为模块时,可见__name__并不等于__main__,所以之后的东西不会执行,也不能被调用
搜索路径:用列表的方式添加或删除
包:创建一个文件夹,文件夹中存放相应模块,文件夹的名字就是包的名字,在文件夹中创建一个__init__.py的模块文件,内容可以为空
使用包,import 包名.模块名
标准库
学习一个模块的方法,以timeit模块为例:
1.IDLE中F1,索引
2. IDLE中print(timeit.__doc__)查询模块说明
3. dir(timeit)查询所有用法
4. timeit.__all__查询对外接口
5. timeit.__file__查询源码路径
介绍timeit模块
爬虫
urllib