文件:
- 打开文件使用open函数,open()的第一个参数是:要打开文件的路径,如果只传入文件名那么将在当前文件下查找文件并打开。第二个参数是:文件的打开模式,其他参数都是默认的。文件的打开模式如下图所示:
f=open('C:\\Users\\Lenovo\\Desktop\\test.txt','r')
f#这个f是文件对象
<_io.TextIOWrapper name='C:\\Users\\Lenovo\\Desktop\\test.txt' mode='r' encoding='cp936'>
#这里name是取自的路径,mode是打开的模式,encoding是编码格式
文件的读取操作:
需要用到以下几个文件对象方法:
f=open('C:\\Users\\Lenovo\\Desktop\\test.txt','rt',encoding="utf-8")
以只读文本模式打开文件,编码是utf-8
str3=f.read()
str3
'年后ijrgwingjnvjnjfdnv困难克服斯诺克女可男可女开心呢可能可男可女可能可男可女 可能发生空空死你女那oadnfkln'
f.tell()
144#文件光标的位置,打开开文件时,光标在文件头,进行读取操作后光标会发生移动
f.seek(0,0)
0#将光标移动到文件的头
f.close()#关闭文件f=open('C:\\Users\\Lenovo\\Desktop\\test2.txt','w',encoding="utf-8")
str4="这是一个新文件"
f.write(str4)#返回写入文件的字节数
7
f.close()
#写完后关闭后才会写入,不关闭存在缓冲区里面想要将文件里的内容迭代输出的话可以使用for循环
方法一:先将文件对象转化为序列再输出
for each in list(b):print(each)这是一个新文件这是一个新文件这是一个新文件这是一个新文件这是一个新文件方法二:直接对文件对象进行操作(推荐使用)
for each in b:print(each)这是一个新文件这是一个新文件这是一个新文件这是一个新文件这是一个新文件
模块:
- 模块就是可用代码段的打包,模块是一个包含你所定义的所有函数和变量的文件,后缀是
.py
。模块可以被别的程序引入,以使用该模块中的函数等功能。 - 我们所知道常用的操作系统就有:Windows、Mac OS、Linux、UNIX等,这些操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的操作系统来考虑使用哪些文件系统模块,这样的做法非常不友好且麻烦,因为这样意味着当你的程序运行环境一改变,你就要相应的去修改大量代码来应付。那么有了OS模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮助你选择正确的模块并调用。
os模块中关于文件/目录常用的函数使用方法
pickle模块:
这个模块几乎可以将prthon的对象转化为二进制的形式取放字节流。
存放:picking,读取:unpicking,pickle模块的使用:
my_list=["123",123,["hello",3.14]]
my_list
['123', 123, ['hello', 3.14]]
pick_file=open("C:\\Users\\Lenovo\\Desktop\\","wb")#注意要使用wb的方式创建文件
pickle.dump(my_list,pick_file)#将列表以二进制的方式存入到文件中
pick_file.close()#关闭该文件,只有关闭后才会保存到文件中去如果要读取的话:
pick_file=open("C:\\Users\\Lenovo\\Desktop\\test.pkl","rb")#先将文件以二进制可读的方式打开
my_list2=pickle.load(pick_file)#文件利用load读取到my_list2列表
my_list2
['123', 123, ['hello', 3.14]]
异常处理:
Python标准异常总结
- AssertionError 断言语句(assert)失败
- AttributeError 尝试访问未知的对象属性
- EOFError 用户输入文件末尾标志EOF(Ctrl+d)
- FloatingPointError 浮点计算错误
- GeneratorExit generator.close()方法被调用的时候
- ImportError 导入模块失败的时候
- IndexError 索引超出序列的范围
- KeyError 字典中查找一个不存在的关键字
- KeyboardInterrupt 用户输入中断键(Ctrl+c)
- MemoryError 内存溢出(可通过删除对象释放内存)
- NameError 尝试访问一个不存在的变量
- NotImplementedError 尚未实现的方法
- OSError 操作系统产生的异常(例如打开一个不存在的文件)
- OverflowError 数值运算超出最大限制
- ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
- RuntimeError 一般的运行时错误
- StopIteration 迭代器没有更多的值
- SyntaxError Python的语法错误
- IndentationError 缩进错误
- TabError Tab和空格混合使用
- SystemError Python编译器系统错误
- SystemExit Python编译器进程被关闭
- TypeError 不同类型间的无效操作
- UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
- UnicodeError Unicode相关的错误(ValueError的子类)
- UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
- UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
- UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)
- ValueError 传入无效的参数
- ZeroDivisionError 除数为零
程序运行过程中可能会抛出某些异常,但是这些异常不会使程序崩溃。那么如何检测和处理这些异常呢?
- 异常的检测可以使用try语句,try语句捕获到异常时,异常后面的语句将不会被执行会被跳过。
栗子:
try:f=open("hhhh.txt")print(f.read())f.close()
except OSError:print("文件出错")如果使用as reason这个可选的参数:
try:f=open("hhhh.txt")print(f.read())f.close()
except OSError as reason:print("文件出错\n错误的原因是:"+str(reason))文件出错
错误的原因是:[Errno 2] No such file or directory: 'hhhh.txt'要捕获多个异常(try语句捕获到异常时,异常后面的语句将不会被执行会被跳过,所以第二个异常没有被打印):
try:sum=1+'1'f=open("hhhh.txt")print(f.read())f.close()
except OSError as reason:print("文件出错\n错误的原因是:"+str(reason))
except TypeError as reason:print("类型出错\n错误的原因是:"+str(reason))类型出错
错误的原因是:unsupported operand type(s) for +: 'int' and 'str'以下方式可以检测多个异常:
try:sum=1+'1'f=open("hhhh.txt")print(f.read())f.close()
except (OSError,TypeError):print("出错")如果想只要程序中出现异常,不管是什么类型的都有提示,可以这样做(不推荐):
try:sum=1+'1'f=open("hhhh.txt")print(f.read())f.close()
except:print("出错")
- 另一个实现方式
栗子:
try:f=open("C:\\Users\\Lenovo\\Desktop\\hhhh.txt","w")sum=1+'1'f.close()
except (OSError,TypeError):print("出错")
finally:#这里面的语句无论如何都会被执行f.close()#防止因异常退出而文件没有被关闭,而导致数据丢失
- 可以使用raise语句自己引发一个异常,只需要在raise后面加上一个异常的名称就好。例如:
raise ZeroDivisionError
引发除0异常。也可以:raise ZeroDivisionError("除数为0")
丰富的else语句:
else语句可以和if语句配合使用:要么怎样,要么不怎样。还可以和while、for循环语句搭配使用:干完了能怎样,干不完就别想怎样。还能和异常处理语句搭配使用:没有问题就干吧。
- 当else和循环配合使用的话,如果循环里面的代码正常的执行完,没有使用break等退出,则会执行循环外else后面的代码。
while:正常退出
else:这里会被执行,否则不被执行
- 只要try语句块里面没有出现任何的异常,将会执行else里面的语句
try:int("abc")
except ValueError as reason:print("出错了"+str(reason))
else:print("没有任何异常")
简洁的with语句:
with在你使用完文件忘记关闭后,with语句就会帮助你关闭。
try:with open("hhhh.txt")as fd:#fd是文件标签print(f.read())#注意代码的缩进with下面要将代码缩进
except OSError as reason:print("文件出错\n错误的原因是:"+str(reason))
对象:
对象就是属性加方法,静态的特征称为属性,动态行为称为方法。在pyhton中约定类名以大写字母开头,函数以小写字母开头,注意: 如果属性的名字和方法相同,属性会将方法覆盖掉。那么:1、不要试图在一个类里面定义出所有能想到的特性和方法,应该利用继承和组合机制进行扩展。2、用不同的词性命名,如属性用名词,方法名用动词。
类的定义:
class Turtle:#属性color="green"weight=10#方法def climb(self):#self相当于C++的this指针,在python中定义类的时候默认self作为第一个参数print("爬行")t=Turtle()#生成类对象,创建类的实例对象
t.climb()#适用类方法
继承:
是子类自动共享父类之间数据和方法的机制,子类继承父类所有的属性和方法,如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性,对父类不受影响,当子类重写父类的构造方法时,如果还想有父类的功能,那么有两种方法:1、调用未绑定的父类方法(只需要在子类构造方法中,写上父类的名字.
构造方法名称,调用父类的构造函数即可)2、使用super函数(只需要在子类构造方法中通过super函数调用父类的构造方法即可:surper().__init__(),括号里面self也不用写
)。多重继承: 一个子类继承多个父类,写法:class Son(father1,father2,.....)
class MyList (list):pass
#pass表示占位符,表示不做任何事情,list表示继承list>>> class Parent:def hello(self):print("父类方法在子类中被调用")>>> class Son(Parent):pass>>>
>>> d=Son()
>>> d.hello()
父类方法在子类中被调用>>> class Son(Parent):def hello(self):print("子类覆盖父类方法")>>> C=Son()
>>> C.hello()
子类覆盖父类方法
多态: 不同对象对同一方法响应不同的行动。也就是不同类里面定义方法的名相同但是方法的内容不同。
>>> class First:def func(self):print("hello")>>> class Second:def func(self):print("你好")>>> a=First()
>>> a.func()
hello
>>> b=Second()
>>> b.func
>>> b.func()
你好
>>>
构造函数: 需要用到函数_ _init_ _(self)
方法,在对象实例化时,传入参数,可以重写_ _init_ _(self)
方法来初始化对对象的操作。
class New:def _init_(self,name):self.name=namedef func(self):print("%s爬"%self.name)
>>> b=New("给我")
>>> b.func()
给我爬
公有和私有:
在pyhton中没有像c++一样的关键字来说明公有还是私有。默认对象的属性和方法都是公有的可以通过.
操作符访问,为了实现私有变量的特征,python内部采用了name mangling(名字改编,名字重整)技术,在python中定义私有变量只需要在变量名或者函数名前加上_ _
两个下划线,那么这个函数或变量就会为私有的了。这样外部就无法访问到了。
>>> class New:__name="小鱼酱"#私有的def func(self):return self.__name>>> a=New()
>>> a.func()
'小鱼酱'
>>> a._New__name#其实python的私有机制是伪私有,可以通过这种方式访问私有变量
'小鱼酱'
>>>
组合:把类的实例化给放到新类里面,这样就把旧类组合进去了
class Turtle:def __init__(self,x):self.num=x
class Fish:def __init__(self,x):self.num=x
class Pool:def __init__(self,x,y):self.turtle=Turtle(x)#turtle是乌龟的实例化对象self.fish=Fish(y)#fish是小鱼的实例化对象def print_num(self):print("水池里总共乌龟有%d只,小鱼%d只"% (self.turtle.num,self.fish.num))>>> pool=Pool(1,10)
>>> pool.print_num()
水池里总共乌龟有1只,小鱼10只
什么是绑定?
python严格要求方法需要有实例才能被调用,这种限制其实就是python所谓的绑定概念。
一些与类相关的BIF:
issubclass(class,classinfo)
如果class是classinfo的一个子类,那么返回True,注意:一个类被认为是其自身的子类,classinfo可以是类对象组成的元组,只要class是其中任何一个候选的子类,则返回True。所有类默认继承自object。isinstance(object,classinfo)
用来检查一个实例对象是否属于一个类,第一个参数是实例对象,第二个参数类,同样第二个参数也可以是元组,元组里面有多个类,属于则返回True否则返回Falsehasattr(object,name)
用来测试一个对象里面是否有指定的属性,第一个参数是对象,第二个参数是指定的属性名,注意:要检查的属性名要用字符串括起来,否则编译器会将其认为变量可能引发异常。getattr(object,name[,default])
用来返回对象指定的属性值,如果属性不存在同时又没有设置default的值,那么她会抛出异常,如果有设置default的值则会打印default的值。setattr(object,name,value)
用来设置对象中指定属性的值,如果属性不存在,它会新建这个属性并且给他赋值,属性同样要加单引号。delattr(object,name)
用来删除对象中指定的属性,如果属性不存在则抛出异常。property(fget=None,fset=None,fdel=None,doc=None)
是用来通过属性设置属性,返回值是一个属性。第一个参数是获得属性的方法,第二个参数是设置属性的方法,第三个参数是删除属性的方法。使用如下图:
小甲鱼干货